如果我想找出两个目录树之间的区别,我通常只执行:
这将精确输出相应文件之间的差异。我只想得到内容不同的相应文件的列表。我认为这只是将命令行选项传递给diff的问题,但在手册页上找不到任何内容。
有什么建议吗?
- 复制目录之间的差异(Linux)
- 对于其中一个目录,如何只获取另一个目录中多余的文件/目录?
- 在UNIX(非Linux)上使用dircmp命令
你说的是Linux,所以你很幸运(至少它应该是可用的,不确定它是什么时候添加的):
1 2
| diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options |
应该做你需要的。
如果还希望查看两个目录中可能不存在的文件的差异:
1 2
| diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options |
- 注:这也适用于MacOS X(约塞米蒂)。
- 很好。但更短的是diff -qr dir1/ dir2/和我对diff -qr dir1/ dir2/ | grep ' differ'的扩展版本。
- @sobi3ch您的版本不只在一个目录中报告文件
- SKV为什么?这是与answer相同的命令。我只把--brief改成了-q的快捷方式。
- @sobi3ch我不是专家:)我只是运行它,它只告诉我文件的区别,而不是只在一个位置存在的文件
- @所以这意味着主要的答案也是错误的。
- @SKV不完全是最初的问题,而是更新答案以适应这个问题。
- 最好与--strip-trailing-cr命令行选项一起使用
- 非常感谢你。
- 当我运行这个(-brief -r时,我得到diff: conflicting output style options diff: Try 'diff --help' for more information. 的-qr方法(在下面的答案中)工作正常。
- @Mikemaxwell应该是--brief。-brief被解释为-b -r -i -e -f,换句话说,它是一组标志,而不是一个选项。
- @达博罗斯:哇,我用Unix/Linux已经有一段时间了,我从来没有意识到"—"和"—"之间有什么区别。(我刚开始的时候不认为有‘——’)谢谢你的解释!
- @好消息是这只是惯例。程序可以任意解释它们。坏消息是,是的,这是几乎所有UNIX工具中的一个非常常见的约定。=)
- 根据man ps,-期权称为"unix期权",--期权称为"gnu long期权"。You should make every program accept long options if it uses any options, for this takes little extra work and helps beginners remember how to use the program.来源:gnu.org/software/libc/manual/h tml_node/getopt long options.h‌&8203;tml,还有google.com/search?Q=GNU+长+选项
我使用的命令是:
这和马克的答案完全一样:)但他的回答让我很不安,因为它使用了不同类型的旗子,这让我看了两遍。使用马克的更详细的标志,它将是:
1
| diff --brief --recursive dir1/ dir2/ |
当另一个答案完全可以接受时,我很抱歉发布。不能阻止我自己…努力少学点书。
- 完全欣赏连贯性——但不要觉得不好;我也赞成马克的回答;)
- ……那么,你用不同的口味给出不同的答案是否有意义?不,不!你把两个答案结合在一个一致的答案上有意义吗?对!;)
- 只是一个问题,q代表什么?它是某物的缩写吗?我在q后面找不到任何逻辑。
- @Kramer65——它和"简略"一样,但我想你想知道为什么Q?也许是为了快点吧?"-根据手册页,b由"忽略空白量的变化"取代。
- @你说得对,我再次道歉。为我辩护,我认为当时我没有能力编辑另一个答案。
- @kramer65我认为q是针对quiet,通常意味着不那么冗长。
- 这里的注释说明了为什么我们在示例中也应该使用长选项。长选项主要是自我记录。当一个人使用短选项时,他们会解释它在代码之外做什么,但是为什么不首先把它作为一个更可读的示例放在代码中呢?gnu long选项页面甚至显示You should make every program accept long options if it uses any options, for this takes little extra work and helps beginners remember how to use the program.来源:gnu.org/software/libc/manual/h tml_node/getopt long options.h‌&8203;tml
我喜欢使用git diff --no-index dir1/ dir2/,因为它可以显示颜色的差异(如果您在Git配置中设置了该选项),并且因为它使用"更少"显示长页面输出中的所有差异。
- 整洁的谁会想到Git可以区分任意目录,而不仅仅是回购文件?
- Perl脚本colordiff在这里非常有用,可以与SVN和normal diff一起使用。
- 如果您将(像我一样)2个目录作为单独的git项目/repos进行比较,那么您需要在stackoverflow.com/a/1792477/473390上添加--no-index。我已经更新了@alan porter的答案。
这两个命令基本上完成了要求的事情:
1 2 3
| diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt
rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt |
它们之间的选择取决于dir1和dir2的位置:
当目录位于两个独立的驱动器上时,diff的性能优于rsync。但是当比较的两个目录在同一个驱动器上时,rsync更快。这是因为diff并行地对两个目录施加几乎相等的负载,从而使两个驱动器的负载最大化。
rsync在实际比较校验和之前,先计算大块校验和。它将I/O操作分组成大的块,并在单个驱动器上进行操作时产生更高效的处理。
- rsync不仅对于单驱动器上的文件速度更快,而且还允许比较子驱动器中的文件,例如rsync --options /usr /bin /var /sbin /lib /old_root将有效地比较当前根目录/(通过指定其中的所有子目录)和/old_root(包括一些旧的/备份),这是diff -r无法做到的。如果您假定具有相同大小、权限和时间戳的文件可能没有更改,那么省略--checksum将为您提供非常快速(如果不是这样的话)的检查哪些文件可能已经更改。
- --delete和rsync的目的是什么?
- --delete的目的是删除目标目录中的现有文件,这些文件不再存在于源目录中。
- 在这种情况下(使用--dry-run标志),实际上没有删除任何内容,rsync只打印dir1中而不是dir2中的文件。
- 我建议把--dry-run放在第一位,以免意外忘记。
- 这两个(diff和rsync)实际产生的结果略有不同。考虑两个目录树,其中testing123/a/f1丢失,testing456/a/b/f4丢失,文件/a/b/c/f9不同。difftesting123/testing456/生成3行,说明f9、f4和f1不同。rsynctesting123/testing456/products:删除a/f1 a/b/f4 a/b/c/f9至少我知道左边缺少f1,但我仍然需要了解为什么f4和f9不同。
meld也是比较两个目录的好工具:
meld dir1/ dir2/
meld有许多选项可以比较文件或目录。如果两个文件不同,则很容易进入文件比较模式并看到确切的差异。
- 很好。我编写了一个简单的Perl脚本来对树进行比较,但我遇到了一些限制。这好像是票。
- 唯一的问题是,由于它是一个图形化的应用程序,所以不适合编写脚本。但如果你不介意图形用户界面,那就太好了!谢谢。
频道同胞"Billings"(Freenode/Centos Fame)与我分享了他的方法:
包括最后一个目录正斜杠并不重要。
此外,在某些较旧/服务器版本的diff上,似乎没有-u选项。
差异的区别:
1 2 3 4 5 6 7
| # diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST
# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ |
- 所以这就是--new-file/-N,它使得diff认为丢失的文件是空的,而--text/-a使它认为所有二进制输入都是文本。我看不出这个特定用例的优点。
diffoscope是一个基于命令行的目录diff工具。
我特别喜欢它可以分成文件:
It will recursively unpack archives of many kinds and transform various binary formats into more human readable form to compare them. It can compare two tarballs, ISO images, or PDF just as easily.
它不仅可以告诉您哪些文件不同,还可以告诉您它们的不同之处。
要查找差异,请使用以下命令:
-r也会区分所有子目录-q告诉diff只在文件不同时报告。
1
| diff --brief dir1/ dir2/ |
--Brief将显示目录中存在的文件。
否则
我们可以使用meld,它将在图形窗口中显示,很容易找到差异。
- --brief和-q是相同的选择。你的陈述听起来好像不一样,但事实并非如此。
您也可以使用Rsync和find。对于find:
1
| find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER |
但是具有相同名称和相同子文件夹但内容不同的文件将不会显示在列表中。
如果你是一个图形用户界面的粉丝,你可以检查一下@alexander提到的Meld。它在Windows和Linux中都可以正常工作。