差异文件存在于两个不同的目录中


303

我有两个目录具有相同的文件列表。我需要使用diff命令比较两个目录中存在的所有文件。是否有一个简单的命令行选项可以执行此操作,还是我必须编写一个Shell脚本来获取文件列表,然后对其进行遍历?

Answers:


422

您可以使用以下diff命令:

diff -bur folder1/ folder2/

这将输出带有统一上下文的忽略空格的递归diff:

  • b标志表示忽略空格
  • u标志表示统一的上下文(前后3行)
  • r标志表示递归

9
您可以diff通过下载Win32GNU实用程序来访问该命令。
Laurent Etiemble

7
我还发现--brief选项很有用;您将获得已更改文件的列表,并可以对其进行单独处理
Dariusz 2013年

27
令其他人感到疑惑的是,-b忽略空白更改并-u给出了3行缓冲区。
摆弄

28
如果您使用rub代替bur,则记住此命令会更容易,例如diff -rub folder1/ folder2/
SomeGuyOnAComputer

11
我想-bur如果您生活在寒冷的气候中会很容易记住。
AlanH '17

126

如果您只想查看不同的文件,则可以使用:

diff -qr dir_one dir_two | sort

选项“ q”将仅显示不同的文件,但不显示不同的内容,“ sort”将按字母顺序排列输出。


1
太好了!也可以有效地工作-即,如果整个子目录仅存在于一个目录中,则该目录停止重复出现,并仅报告子目录本身(不包含其后继内容)。非常好!!
Something Something 2015年

这是一个非常好的第一步:看什么,如果有的话,确实不同,然后做了详细的diff每一对不同的文件。如果只有一个或两个文件不同而有几十个文件不同,那么一个人的方法就会大为不同。diff一次输入数十个文件可能使我迷失在输出中!
jvriesem

另外,可以-x PATTERN在命令中包括以排除某些子目录。例如,diff -qr repo1 repo2 -x ".git"将比较两个目录(repo1和repo2),但将排除各个目录的.git文件夹中的文件。
ViFI

20

Diff有一个选项-r可以做到这一点。

diff -r dir1 dir2


11

diff不仅可以比较两个文件,还可以通过使用该-r选项遍历整个目录树,并递归检查子目录和文件之间的差异,这些差异出现在每个树的可比较点。

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

3

如果是GNU diff,那么您应该能够将其指向两个目录并使用-r选项。

否则,请尝试使用

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

注意:正如丹尼斯(Dennis)在注释部分所指出的那样,您实际上不需要在ls上执行命令替换。我这样做已经很久了,以至于我几乎在自动驾驶仪上这样做,并替换了我需要获取文件列表以进行比较的命令。

我也忘记添加我执行'\ ls'来暂时禁用ls到GNU ls的别名,这样我会丢失GNU ls返回的列表中的颜色格式信息。


2
无需使用lsfor i in ./dir1/*
已暂停,直至另行通知。

1
@丹尼斯,时髦的捷径。+1。我很习惯执行命令替换,尽管它是自动的,并且只使用我需要的命令,例如,有时我使用的是find。使用ls还可以让我更多地使用目录列表,例如,基于反向时间而不是默认顺序。
罗伯·威尔斯

0

这是一个脚本,用于显示两个文件夹中文件之间的差异。它递归地工作。更改目录1和目录2。

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

0

如果您特别不想比较文件的内容,而只检查两个目录中都不存在的文件,则可以比较由另一个命令生成的文件列表。

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'告诉find不要在输出路径前加上根目录前缀。

我还添加sort了以确保文件的顺序在的两次调用中都相同find

所述grep在端部除去大约相同的输入线路信息。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.