我有一个照片文件夹(原始目录)。
我将这些照片导入 Shotwell,Shotwell 已将文件复制到基于 EXIF 数据的目录结构中(新目录/年/月/日)。
我想仔细检查原始目录中的所有文件是否已正确复制到新的目录结构中。具体来说,我想生成原始文件夹中不位于新文件夹中的任何文件的列表(无论子目录如何)。理想情况下,包含校验和或其他一些内容检查。
在 Linux 中实现这一目标的最佳方法是什么?
答案1
一种方法是将一个目录树中所有文件的 md5sum 存储在一个文件中,然后将另一个目录树中所有文件的 md5sum 存储在另一个文件中。然后检查它们之间是否有任何差异。
就像是:
#!/bin/sh
find dir1/ -type f -exec md5sum {} + | sort > dir1.md5
find dir2/ -type f -exec md5sum {} + | sort > dir2.md5
comm -3 <(cut -d ' ' -f 1 dir1.md5) <(cut -d ' ' -f 1 dir2.md5)
这将输出不在两个文件中的 md5sum 列表(请参阅man comm
选项-3
)。打印的任何 md5sum 都可用于查找dir1.md5
和dir2.md5
文件中的文件名,例如使用grep
或awk
。
顺便说一句,如果不是很明显,.md5 文件需要同时包含 md5sum 和文件名,但我们只想比较 md5sum(.md5 文件的第一个“字段”)而不包含文件名(因为路径/即使 md5sum 相同,两个文件之间的文件名也始终不同),因此进程替换cut
为comm
.
注意:dir2 中但不在 dir1 中的文件的 md5sum 将缩进一个制表符。这对于了解特定 md5sum 属于哪个文件(目录树)很有用,因此您可以使用它从 dir1.md5 中提取第一列的文件名,并在 dir2.md5 的第二列中搜索文件名。或者只是用 去掉前导空格sed
。