递归比较两个目录中的文件名,忽略内容和 return 退出代码取决于结果
Recursively compare filenames in two directories, ignoring contents and return an exit code depending on result
这是一个 bash 脚本,用于比较本地和远程挂载。
本地文件和目录被符号链接到远程,新文件除外。
我需要替换 diff
因为它比较内容并且在 Internet 上变得非常慢。
我一直在尝试 diff <( ls /local/ ) <( ls /remote/ )
和 diff <( tree /local/ ) <( tree /remote/ )
之类的东西,但无法使它们工作,因为它们不是递归的,或者符号链接会妨碍。
rsync
是我确定丢失文件的方法,但我找不到管理退出代码和集成到脚本中的方法。
脚本看起来像这样:
#!/bin/bash
set -e
echo "Backup Command"
sleep 10
while :; do
echo "Testing backup"
if
diff -r /local/ /remote/ ; then
echo "diff matches!"
break
else
echo "diff didn't match, waiting for cache"
sleep 600
fi
done
echo "Finished!"
使用cmp
检查两个事物是否相同。
使用find
获取所有可能的路径。
sort
传递给cmp
之前的路径,所以是一样的
使用零终止字符串来处理文件名中的所有特殊字符。
if cmp -s <(cd local && find -print0 | sort -z) <(cd remote && find -print0 | sort -z); then
echo "local and remote have the same directory and file structure"
else
echo "Oooh! local and remote differ. Or there was trouble."
fi
答案相当简单明了,我都试过了,但没有一起试过。为了使这项工作有效,由于符号链接,需要 find -L
来跟踪链接,然后需要 sort
才能使它们匹配。
我将 diff 命令替换为以下内容:
diff <( find -L local |sort) <( find -L remote |sort)
这是一个 bash 脚本,用于比较本地和远程挂载。 本地文件和目录被符号链接到远程,新文件除外。
我需要替换 diff
因为它比较内容并且在 Internet 上变得非常慢。
我一直在尝试 diff <( ls /local/ ) <( ls /remote/ )
和 diff <( tree /local/ ) <( tree /remote/ )
之类的东西,但无法使它们工作,因为它们不是递归的,或者符号链接会妨碍。
rsync
是我确定丢失文件的方法,但我找不到管理退出代码和集成到脚本中的方法。
脚本看起来像这样:
#!/bin/bash
set -e
echo "Backup Command"
sleep 10
while :; do
echo "Testing backup"
if
diff -r /local/ /remote/ ; then
echo "diff matches!"
break
else
echo "diff didn't match, waiting for cache"
sleep 600
fi
done
echo "Finished!"
使用cmp
检查两个事物是否相同。
使用find
获取所有可能的路径。
sort
传递给cmp
之前的路径,所以是一样的
使用零终止字符串来处理文件名中的所有特殊字符。
if cmp -s <(cd local && find -print0 | sort -z) <(cd remote && find -print0 | sort -z); then
echo "local and remote have the same directory and file structure"
else
echo "Oooh! local and remote differ. Or there was trouble."
fi
答案相当简单明了,我都试过了,但没有一起试过。为了使这项工作有效,由于符号链接,需要 find -L
来跟踪链接,然后需要 sort
才能使它们匹配。
我将 diff 命令替换为以下内容:
diff <( find -L local |sort) <( find -L remote |sort)