我有两个不同的文件夹,每个文件夹中都有相同的文件名,但是其中一个缺少文件。我怎么能够在两个文件夹比较Folder1
和Folder2
并列出缺少文件Folder2
,其Folder1
包含的内容。
$ 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
手册。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句