通过校验和查找丢失的文件

时间:2010-06-09 13:05:49

标签: linux shell scripting checksum

我正在Linux系统上进行两个文件系统之间的大型数据迁移(让我们称之为F1和F2),这必然会将数据逐字复制到F2 和更改文件名。

我想编写一个脚本来生成一个文件列表,这些文件在F1中但在F2中不是,即那些未被迁移脚本复制到新层次结构中的文件,这样我就可以返回并手动迁移它们。遗憾的是,由于不值得进入的原因,无法修改迁移脚本以列出未迁移的文件。我的问题与this previously answered one不同,因为我不能依赖文件名作为比较。

我知道这个过程的基本概要是:

  1. 为所有文件生成校验和列表,通过F1递归
  2. 对F2
  3. 执行相同操作
  4. 比较列表并生成校验和的负交集,忽略文件名,以查找F1中 而不是F2的文件。
  5. 我有点被困在那个阶段,所以我很欣赏任何关于使用哪些工具的指示。我想我需要使用'comm'命令来比较文件校验和列表,但由于 md5sum sha512sum 等将文件名放在校验和旁边,我看不出有办法让它给我带来有用的比较。也许 awk 是要走的路?

    我正在使用Red Hat Enterprise Linux 5.x。

    感谢。

3 个答案:

答案 0 :(得分:3)

您可以这样做:

f1# find yourrootdir -type f -exec sha1sum {} >> initial_files \; 
f1# ...copy initial_files to machine f2...
f1# ...start copy...
f2# find yournewrootdir -type f -exec sha1sum {} >> final_files \;
f2# sort initial_files > INITIAL
f2# sort final_files > FINAL
f2# for sha1 in `comm -23 <(cat INITIAL | awk '{print $1}') <(cat FINAL | awk '{print $1}')`; do grep $sha1 INITIAL; done

这将显示“initial_files”中在final_files中没有SHA1的行。

最后一行只使用sha1sums来执行comm命令,然后在initial_files中greps每个丢失的sha1sum。

答案 1 :(得分:2)

在F1上:

# find / -type f -exec md5sum {} + > F1

在F2:

# find / -type f -exec md5sum {} + > F2

然后:

# diff F1 F2

您可能想要查看find的更多选项,此行只能查找常规文件。

答案 2 :(得分:1)

或许可以查看FSLint的源代码以获取指针:http://code.google.com/p/fslint/source/browse/trunk/fslint/findup