2010-01-07 83 views
210

我有两个目录具有相同的文件列表。我需要使用diff命令来比较两个目录中的所有文件。是否有一个简单的命令行选项来完成它,还是必须编写一个shell脚本来获取文件列表,然后遍历它们?差异文件存在于两个不同的目录中

回答

293

您可以使用该diff命令:

diff -bur folder1/ folder2/ 

这将输出一个递归DIFF无视空间,用统一的背景:

  • b标志意味着忽略空白
  • ü标志意味着一个统一的环境(3条线之前和之后)
  • [R标志意味着递归
+4

在Windows中,你用什么来作出这样的diff命令? – onmyway133 2013-02-26 10:09:48

+8

您可以通过下载[GNU utilities for Win32](http://unxutils.sourceforge.net/)来访问'diff'命令。 – 2013-02-26 13:32:08

+6

我也发现--brief选项很有用;你会得到已更改文件的列表,并可以分别处理它们 – Dariusz 2013-04-03 12:44:35

9

diff不仅可以比较两个文件,它可以通过使用-r选项来遍历整个目录树,递归地检查每个树中可比较点发生的子目录和文件之间的差异。

$ man diff 

... 

-r --recursive 
     Recursively compare any subdirectories found. 

... 
16

差异有一个选项-r这意味着要做到这一点。

diff -r dir1 dir2

3

如果它是GNU的diff,那么你就应该能够在两个目录指向它并使用-r选项。

否则,请尝试使用

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

注:正如Dennis在评论部分指出的那样,你实际上并不需要在ls上进行命令替换。我一直这样做了很长时间,我几乎在自动驾驶仪上这样做,并用我需要的命令来获取我的文件列表进行比较。

另外我忘了补充说我暂时禁用我的别名ls到GNU ls,这样我就失去了GNU ls返回的列表中的颜色格式信息。

+2

没有必要使用'ls':'为我in。/ dir1/*' – 2010-01-07 12:17:13

+1

@ Dennis,时髦的捷径。 +1。我很习惯做命令替换,虽然它是自动的,我只是使用我需要的任何命令,例如有时我正在使用find。使用ls也可以让我玩更多的dir列表,例如反向时间而不是默认顺序。 – 2010-01-07 12:49:59

72

如果你只看到不同的文件感兴趣,你可以使用:

diff -qr dir_one dir_two | sort 

选择“Q”将只显示不同的是不同的文件,而不是内容,和“排序”将按字母顺序排列输出。

+1

太棒了!也有效地工作 - 即,如果整个子目录仅存在于其中一个目录中,则其停止重复进入并且仅报告子目录本身(没有其后续内容)。非常好!! – SomethingSomething 2015-03-26 09:17:00

+0

'-q'选项man!我爱你。 – Campa 2017-11-23 09:20:35

0

以下是显示两个文件夹中文件差异的脚本。它递归地工作。更改dir1和dir2。

(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 -rq /path/to/folder1 /path/to/folder2  
+0

这复制了一个现有的答案,并没有添加任何新内容。除非你真的有新的东西来贡献,否则请不要发布答案。 – 2017-06-06 21:35:09

相关问题