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

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中的文件?


当前回答

GNU grep可以使用-v选项反向搜索。这使得grep报告不匹配的行。这样就可以从dir1中的文件列表中删除dir2中的文件。

grep -v -F -x -f <(find dir2 -type f -printf '%P\n') <(find dir1 -type f -printf '%P\n')

选项-F -x告诉grep在整行上执行字符串搜索。

其他回答

GNU grep可以使用-v选项反向搜索。这使得grep报告不匹配的行。这样就可以从dir1中的文件列表中删除dir2中的文件。

grep -v -F -x -f <(find dir2 -type f -printf '%P\n') <(find dir1 -type f -printf '%P\n')

选项-F -x告诉grep在整行上执行字符串搜索。

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

解释:

Diff -r dir1 dir2显示哪些文件只在dir1中,哪些文件只在dir2中,以及两个目录中文件的变化(如果有的话)。 Diff -r dir1 dir2 | grep dir1显示哪些文件只在dir1中 Awk只打印文件名。

这应该做的工作:

diff -rq dir1 dir2

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

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

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

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

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

comm -23 <(ls dir1 |sort) <(ls dir2|sort)

该命令将为您提供dir1而不是dir2中的文件。

关于<()符号,你可以谷歌它作为'进程替换'。