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

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在整行上执行字符串搜索。

其他回答

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

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

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

这是用于打印同步两个目录的命令的bash脚本

dir1=/tmp/path_to_dir1
dir2=/tmp/path_to_dir2
diff -rq $dir1 $dir2 | sed -e "s|Only in $dir2\(.*\): \(.*\)|cp -r $dir2\1/\2 $dir1\1|" |  sed -e "s|Only in $dir1\(.*\): \(.*\)|cp -r $dir1\1/\2 $dir2\1|" 

进行这种比较的一个好方法是使用find和md5sum,然后使用diff。

例子:

使用find列出目录中的所有文件,然后计算每个文件的md5散列,并将其输送到一个文件:

find /dir1/ -type f -exec md5sum {} \; > dir1.txt

对另一个目录执行相同的步骤:

find /dir2/ -type f -exec md5sum {} \; > dir2.txt

然后用"diff"比较结果两个文件:

diff dir1.txt dir2.txt

当要比较的两个目录不在同一台机器上,并且需要确保两个目录中的文件相等时,此策略非常有用。

完成这项工作的另一种好方法是使用git

git diff --no-index dir1/ dir2/

最好的问候!

这个答案通过添加-D选项优化了@Adail-Junior的建议之一,当比较的目录都不是git存储库时,这是很有帮助的:

git diff -D --no-index dir1/ dir2/

如果你使用-D,你将不会看到与/dev/null的比较: 文本 二进制文件a/whatever和/dev/null不同

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