我有两个不同的文件夹,每个文件夹中都有相同的文件名,但其中一个缺少文件。我怎么能够在两个文件夹比较Folder1
和Folder2
并列出缺少文件Folder2
,其Folder1
包含的内容。
$ 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
手册。