递归比较两个目录中的文件名,忽略内容并根据结果返回退出代码

时间:2019-09-11 08:04:41

标签: bash diff rsync

这是一个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!"

2 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

答案很简单而且很明显,我尝试了两者,但没有一起尝试过。为了使这项工作有效,由于符号链接,需要find -L来跟随链接,然后需要sort来使它们匹配。

我用以下命令替换了diff命令:

diff <( find -L local |sort) <( find -L remote |sort)

相关问题