我试图找到一个目录中存在的文件,但不在另一个目录中,我尝试使用这个命令:

diff -q dir1 dir2

上面这个命令的问题是,它在dir1中找到了文件,但在dir2中没有找到,在dir2中找到了文件,但在dir1中没有找到,

我正在寻找dir1中的文件,而不是dir2中的文件。

下面是我的数据的一个小样本

dir1    dir2    dir3
1.txt   1.txt   1.txt
2.txt   3.txt   3.txt
5.txt   4.txt   5.txt
6.txt   7.txt   8.txt

我脑子里的另一个问题是,如何在一个命令中找到dir1中的文件,而不是dir2或dir3中的文件?


当前回答

这有点晚,但可能会帮助到一些人。不确定diff或rsync是否只输出像这样的裸格式的文件名。感谢plhn给出了我在下面扩展的很好的解决方案。

如果您只想要文件名,那么就很容易以干净的格式复制所需的文件,您可以使用find命令。

comm -23 <(find dir1 | sed 's/dir1/\//'| sort) <(find dir2 | sed 's/dir2/\//'| sort) | sed 's/^\//dir1/'

这假设dir1和dir2都在同一个父文件夹中。Sed只是删除了父文件夹,以便您可以进行比较。最后一个sed只是把dir1的名字放回去。

如果你只想要文件:

comm -23 <(find dir1 -type f | sed 's/dir1/\//'| sort) <(find dir2 -type f | sed 's/dir2/\//'| sort) | sed 's/^\//dir1/'

对于目录也是如此:

comm -23 <(find dir1 -type d | sed 's/dir1/\//'| sort) <(find dir2 -type d | sed 's/dir2/\//'| sort) | sed 's/^\//dir1/'

其他回答

另一种方法(对于大目录可能更快):

$ find dir1 | sed 's,^[^/]*/,,' | sort > dir1.txt && find dir2 | sed 's,^[^/]*/,,' | sort > dir2.txt
$ diff dir1.txt dir2.txt

由于Erik的帖子,sed命令删除了第一个目录组件)

这应该做的工作:

diff -rq dir1 dir2

选项解释(通过diff(1)手册页):

-r -递归比较找到的任何子目录。 -q -只输出文件是否不同。

使用DIFF命令比较两个目录的简化方法

diff文件名。1文件名。2 > filename.dat >>输入

运行完成后打开filename.dat

你会看到: 仅在文件名中。1: filename.2 仅在:directory_name: name_of_file1 仅在:directory_Name: name_of_file2

Meld (http://meldmerge.org/)在比较目录和其中的文件方面做得很好。

接受的答案还将列出两个目录中存在但内容不同的文件。只列出dir1中存在的文件,你可以使用:

diff -r dir1 dir2 | grep 'Only in' | grep dir1 | awk '{print $4}' > difference1.txt

解释:

Diff -r dir1 dir2:比较 grep 'Only in':获取包含'Only in'的行 Grep dir1:获取包含dir的行