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