比较两个文件夹中丢失的文件

Ted*_*291 3 filenames files

我有两个不同的文件夹,每个文件夹中都有相同的文件名,但其中一个缺少文件。我怎么能够在两个文件夹比较Folder1Folder2并列出缺少文件Folder2,其Folder1包含的内容。

Kus*_*nda 6

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

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

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

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

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

2 directories, 8 files
Run Code Online (Sandbox Code Playgroud)

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

$ diff dir1 dir2
Only in dir1: file1
Only in dir1: file3
Run Code Online (Sandbox Code Playgroud)

如果同名文件的文件内容不同,那么这显然会输出很多可能不感兴趣的额外数据。 diff -q在这种情况下可能会安静一点。

另请参阅diff系统手册。


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

$ rsync -r --ignore-existing -i -n dir1/ dir2
>f+++++++++ file1
>f+++++++++ file3
Run Code Online (Sandbox Code Playgroud)

上面的代码将为每个文件输出一行,该文件下的任何地方dir1都没有对应的文件dir2。该-n选项(--dry-run)可以确保没有文件实际上是转移到dir2

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

另请参阅rsync手册。