查找存在于一个目录但不在另一个目录中的文件

我想找到存在于一个目录中但不在另一个目录中的文件,我试着使用这个命令。

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中的文件,而不是dir2dir3中的文件?

解决办法
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只打印文件名。

评论(2)

这个应该可以了。

diff -rq dir1 dir2

选项解释(通过 diff(1) man page)。

  • -r - 递归比较所有找到的子目录。
  • -q - 只输出文件是否不同。
评论(4)

comm -23 
评论(4)

比较的好方法是用findmd5sum,然后用diff

例子:用find列出目录中的所有文件,然后计算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/

问候

评论(1)

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

[![Meld比较目录][1]][1]

[1]: http://i.stack.imgur.com/KsNmd.png

评论(4)

vim的DirDiff插件是另一个非常有用的比较目录的工具。

vim -c "DirDiff dir1 dir2"

它不仅列出了目录之间哪些文件是不同的,而且还允许你用vimdiff检查/修改不同的文件。

评论(0)

我对所有的回复都不满意,因为大多数回复的速度都很慢,而且对于大的目录会产生不必要的长输出,所以我自己写了一个Python脚本来比较两个文件夹。

与其他许多解决方案不同,它不比较文件的内容。 同时,它也不会进入另一个目录中缺少的子目录。 因此,输出的结果非常简洁,而且脚本的工作速度也很快。


#!/usr/bin/env python3

import os, sys

def compare_dirs(d1: "old directory name", d2: "new directory name"):
    def print_local(a, msg):
        print('DIR ' if a[2] else 'FILE', a[1], msg)
    # ensure validity
    for d in [d1,d2]:
        if not os.path.isdir(d):
            raise ValueError("not a directory: " + d)
    # get relative path
    l1 = [(x,os.path.join(d1,x)) for x in os.listdir(d1)]
    l2 = [(x,os.path.join(d2,x)) for x in os.listdir(d2)]
    # determine type: directory or file?
    l1 = sorted([(x,y,os.path.isdir(y)) for x,y in l1])
    l2 = sorted([(x,y,os.path.isdir(y)) for x,y in l2])
    i1 = i2 = 0
    common_dirs = []
    while i1
评论(1)

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

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

sed命令删除第一个目录组件感谢Erik的帖子

评论(1)

这个答案优化了 @Adail-Junior 的一个建议,增加了 -D 选项,当被比较的两个目录都不是 git 仓库时,这个选项很有用。

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

如果你使用-D,那么你将看不到与/dev/null的比较。

二进制文件a/whatever和/dev/null不同。
评论(1)

这有点晚了,但也许能帮到别人。 不知道diff或rsync是否会吐出像这样的裸体格式的文件名。 感谢plhn给出了很好的解决方案,我在下面进行了扩展。

如果你只想要文件名,这样就可以很容易地以干净的格式复制你需要的文件,你可以使用 find 命令。


comm -23 
评论(2)

被接受的答案也会列出存在于两个目录中的文件,但内容不同。 要只列出存在于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的行
评论(0)

kdiff3有一个很好的文件和目录的差异界面。

它适用于Windows、Linux和macOS。

你可以通过多种方式安装它。

评论(0)

这是一个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|" 
评论(0)

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

&gt。 diff filename.1 filename.2 > filename.dat >>输入

运行完成后打开文件名.dat。

你会看到。 只有在filename. 1: filename. 2 仅在: 目录_name: name_of_file1 只有在。 目录_名称。 name_of_file2

评论(1)

GNU grep可以用-v选项进行反向搜索。 这使得 grep报告不匹配的行。 通过这个方法,你可以从 "dir1 "的文件列表中删除 "dir2 "中的文件。


grep -v -F -x -f 
评论(0)