如何让`diff -qr`显示子目录下的所有文件?

时间:2014-06-28 02:38:14

标签: linux bash diff gnu

让我们说这是我的文件树:

a
a/file1
a/subdir1
a/subdir1/file1
a/subdir1/file2
b
b/file1

当我运行diff -qr a b时,它会返回以下内容。它正在进行递归diff,但它没有列出subdir下的文件。

Files a/file1 and b/file1 differ
Only in a: subdir1

我希望看到的是以下内容。是否有任何diff选项可以执行此操作?

Files a/file1 and b/file1 differ
Only in a: subdir1
Only in a: subdir1/file1
Only in a: subdir1/file2

(注意:我使用的是Ubuntu,GNU diffutils 3.2)

2 个答案:

答案 0 :(得分:0)

请参阅Given two directory trees, how can I find out which files differ?

diff似乎没有提供关于存在于一个目录中而不是另一个目录中的文件的比较或输出,正如您尝试的那样。正如Matt在下面指出的那样,你必须解析diff和diff之外的a和b下面的文件列表,并调用diff来比较两个目录中存在的那些文件,并输出那些只出现在一个目录中的文件。如果在diff中有类似的东西会很好,但它本质上要求diff来比较file_a和nonexistent_file_b之间的差异。抱歉,最初的误读。

答案 1 :(得分:0)

运行diff -qr a b时获得该输出的原因是因为subdir1仅在a中。因此,a下的所有内容都必须与b中的内容不同,因此它显然不会通过并列出所有文件。我没有找到一种方法来列出所有文件,无论如何。我把另一个有希望帮助的命令放在一起!

我的文件结构:

Matt@MattPC ~/perl/testing/10
$ find .
.
./a
./a/file1
./a/subdir1
./a/subdir1/file1
./a/subdir1/file2
./b
./b/file1

您运行的diff命令(相同的输出):

Matt@MattPC ~/perl/testing/10
$ diff -q -r a b
Only in a: subdir1

这是我写的命令,希望能为您提供所需的信息。基本上,它调用find afind b并将输出传递给diff来比较它们。但是,我们必须将其传输到sed 's/^[^/]\+//'以删除第一个目录的名称,在本例中为ab

Matt@MattPC ~/perl/testing/10
$ diff <(find a | sed 's/^[^/]\+//') <(find b | sed 's/^[^/]\+//')
3,5d2
< /subdir1
< /subdir1/file1
< /subdir1/file2

希望这有帮助!如果命令需要tweeking,请告诉我。

相关问题