我有两个具有相同文件列表的目录。我需要使用diff
命令比较两个目录中的所有文件。是否有一个简单的命令行选项,或者我是否必须编写一个shell脚本来获取文件列表然后遍历它们?
答案 0 :(得分:373)
您可以使用diff
命令:
diff -bur folder1/ folder2/
这将输出一个忽略空格的递归diff,具有统一的上下文:
答案 1 :(得分:99)
如果您只想查看不同的文件,可以使用:
diff -qr dir_one dir_two | sort
选项“q”仅显示不同的文件但不显示不同的内容,“sort”将按字母顺序排列输出。
答案 2 :(得分:18)
Diff有一个选项-r
就是为了做到这一点。
diff -r dir1 dir2
答案 3 :(得分:10)
diff
不仅可以比较两个文件,还可以使用-r
选项遍历整个目录树,递归检查子目录和每个树中可比较点上发生的文件之间的差异。 / p>
$ man diff
...
-r --recursive
Recursively compare any subdirectories found.
...
答案 4 :(得分:3)
如果它是GNU diff,那么你应该只能将它指向两个目录并使用-r选项。
否则,请尝试使用
for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done
N.B。正如Dennis在评论部分所指出的,你实际上并不需要在ls上执行命令替换。我已经这么做了很长时间以至于我在自动驾驶仪上做了很多这样的事情并且用我需要的命令来获取我的文件列表以进行比较。
另外我忘了补充一点,我确实要暂时禁用我的别名ls到GNU ls,这样我就会丢失GNU ls返回的列表中的颜色格式信息。
答案 5 :(得分: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" )
答案 6 :(得分:0)
如果您特别不想比较文件的内容,而只检查两个目录中都不存在的文件,则可以比较由另一个命令生成的文件列表。
diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'
-printf '%P\n'
告诉find
不要在输出路径前面加上根目录。
我还添加了sort
,以确保两次调用find
时文件的顺序相同。
最后的grep
删除有关相同输入行的信息。
答案 7 :(得分:0)
在实践中,这个问题经常伴随着一些限制出现。在这种情况下,以下解决方案模板可能会派上用场。
cd dir1
find . \( -name '*.txt' -o -iname '*.md' \) | xargs -i diff -u '{}' 'dir2/{}'
答案 8 :(得分:0)
在磁盘上使用 git/svn 或多个 git/svn 实例时,这是过去 5-10 年来对我来说最有用的事情之一,有人可能会觉得有用:
diff -burN /path/to/directory1 /path/to/directory2 | grep +++
或:
git diff /path/to/directory1 | grep +++
它为您提供了触摸过的不同文件的快照,而不必“减少”或“增加”输出。然后,您只需对单个文件进行比较。
答案 9 :(得分:-3)
试试这个:
diff -rq /path/to/folder1 /path/to/folder2