我有两个目录应该包含相同的文件并具有相同的目录结构。
我认为其中一个目录中缺少了某些内容。
使用 bash shell,有没有办法比较我的目录并查看其中一个目录是否缺少另一个目录中的文件?
答案1
diff
您可以像使用文件一样使用该命令:
diff <directory1> <directory2>
如果您还想查看子文件夹和文件,可以使用以下-r
选项:
diff -r <directory1> <directory2>
答案2
进行此比较的一个好方法是使用find
with md5sum
,然后使用 a diff
。
例子
使用 find 列出目录中的所有文件,然后计算每个文件的 md5 哈希值并将其按文件名排序传输到文件:
find /dir1/ -type f -exec md5sum {} + | sort -k 2 > dir1.txt
对另一个目录执行相同的操作:
find /dir2/ -type f -exec md5sum {} + | sort -k 2 > dir2.txt
然后将两个文件的结果进行比较diff
:
diff -u dir1.txt dir2.txt
或者作为使用进程替换的单个命令:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2) <(find /dir2/ -type f -exec md5sum {} + | sort -k 2)
如果您只想查看更改:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ") <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ")
cut 命令仅打印要通过 diff 进行比较的哈希值(第一个字段)。否则,diff 将打印每一行,因为即使哈希值相同,目录路径也会不同。
但您不知道哪个文件发生了变化......
为此,你可以尝试类似
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /') <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /')
当要比较的两个目录不在同一台机器上并且您需要确保两个目录中的文件相同时,此策略非常有用。
完成这项工作的另一个好方法是使用 Git 的diff
命令(当文件具有不同的权限时可能会导致问题 -> 然后每个文件都会在输出中列出):
git diff --no-index dir1/ dir2/
答案3
尽管您没有使用 bash,但您可以使用 diff 和--brief
and来完成--recursive
:
$ diff -rq dir1 dir2
Only in dir2: file2
Only in dir1: file1
包括man diff
两个选项:
-q
,--brief
仅当文件不同时报告
-r
,--recursive
递归比较找到的任何子目录