比较两个目录的内容

比较两个目录的内容

我有两个目录应该包含相同的文件并具有相同的目录结构。

我认为其中一个目录中缺少了某些内容。

使用 bash shell,有没有办法比较我的目录并查看其中一个目录是否缺少另一个目录中的文件?

答案1

diff您可以像使用文件一样使用该命令:

diff <directory1> <directory2>

如果您还想查看子文件夹和文件,可以使用以下-r选项:

diff -r <directory1> <directory2>

答案2

进行此比较的一个好方法是使用findwith 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 和--briefand来完成--recursive

$ diff -rq dir1 dir2 
Only in dir2: file2
Only in dir1: file1

包括man diff两个选项:

-q--brief
仅当文件不同时报告

-r--recursive
递归比较找到的任何子目录

答案4

这里有另一种方法,只比较文件名,而不比较其内容:

diff <(cd folder1 && find . | sort) <(cd folder2 && find . | sort)

这是列出丢失文件的简单方法,但当然它检测不到名称相同但内容不同的文件!

(我个人用的是自己的diffdirs脚本,但这是更大的图书馆

相关内容