比较两个文件夹是否缺少文件

比较两个文件夹是否缺少文件

我有两个不同的文件夹,每个文件夹中的文件名相同,但其中一个文件夹缺少文件。我如何能够比较两个文件夹Folder1并列出其中包含的Folder2缺少的文件。Folder2Folder1

答案1

$ tree
.
|-- dir1
|   |-- file1
|   |-- file2
|   |-- file3
|   |-- file4
|   `-- file5
`-- dir2
    |-- file2
    |-- file4
    `-- file5

2 directories, 8 files
$ for f1 in dir1/*; do f2="dir2/${f1#dir1/}"; [ ! -e "$f2" ] && printf '%s\n' "$f2"; done
dir2/file1
dir2/file3

这将循环遍历第一个目录中的所有名称,并为每个名称创建预计存在于第二个目录中的文件的相应名称。如果该文件不存在,则打印其名称。

循环写得更详细(并且使用basename而不是参数替换来从第一个目录中的文件的路径名中删除目录名):

for f1 in dir1/*; do
    f2="dir2/$( basename "$f1" )"
    if [ ! -e "$f2" ]; then
        printf '%s\n' "$f2"
    fi
done

如果两个目录下的文件不仅名称相同,而且内容也相同,则可以使用diff(注:diff这里用的是BSD,GNUdiff可能有别的说法):

$ diff dir1 dir2
Only in dir1: file1
Only in dir1: file3

如果具有相同名称的文件的文件内容不同,那么这显然会输出大量可能不感兴趣的附加数据。 diff -q在这种情况下可能会安静一点。

另请参阅diff系统手册。


为了比较更深的层次结构,您可能需要使用rsync

$ rsync -r --ignore-existing -i -n dir1/ dir2
>f+++++++++ file1
>f+++++++++ file3

上面将为每个文件输出一行,dir1该文件下没有相应的文件dir2。选项-n( --dry-run) 确保没有文件实际传输到dir2.

选项-r( --recursive) 使操作递归,并且-i( --itemize-changes) 选择特定的输出格式(>f和 加号表示该文件是接收端的新文件)。

另请参阅rsync手册。

相关内容