递归比较两个目录中的文件名,忽略内容和 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)