我正在Linux系统上进行两个文件系统之间的大型数据迁移(让我们称之为F1和F2),这必然会将数据逐字复制到F2 和更改文件名。
我想编写一个脚本来生成一个文件列表,这些文件在F1中但在F2中不是,即那些未被迁移脚本复制到新层次结构中的文件,这样我就可以返回并手动迁移它们。遗憾的是,由于不值得进入的原因,无法修改迁移脚本以列出未迁移的文件。我的问题与this previously answered one不同,因为我不能依赖文件名作为比较。
我知道这个过程的基本概要是:
我有点被困在那个阶段,所以我很欣赏任何关于使用哪些工具的指示。我想我需要使用'comm'命令来比较文件校验和列表,但由于 md5sum , sha512sum 等将文件名放在校验和旁边,我看不出有办法让它给我带来有用的比较。也许 awk 是要走的路?
我正在使用Red Hat Enterprise Linux 5.x。
感谢。
答案 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