我有两个不同的文件夹,每个文件夹中的文件名相同,但其中一个文件夹缺少文件。我如何能够比较两个文件夹Folder1
并列出其中包含的Folder2
缺少的文件。Folder2
Folder1
答案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
手册。