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

Linux 通过校验和查找丢失的文件,linux,shell,scripting,checksum,Linux,Shell,Scripting,Checksum,我正在Linux系统上进行两个文件系统(我们称之为F1和F2)之间的大型数据迁移,这必然涉及将数据逐字复制到F2上不同结构的层次结构中,并更改文件名 我想编写一个脚本来生成一个文件列表,这些文件在F1中,但在F2中不在,即那些没有被迁移脚本复制到新层次结构中的文件,以便我可以返回并手动迁移它们。不幸的是,由于不值得深入研究的原因,无法修改迁移脚本以列出它未迁移的文件。我的问题不同于,因为我不能依赖文件名作为比较 我知道这个过程的基本轮廓是: 生成所有文件的校验和列表,通过F1递归 对F2进行同样

我正在Linux系统上进行两个文件系统(我们称之为F1和F2)之间的大型数据迁移,这必然涉及将数据逐字复制到F2上不同结构的层次结构中,并更改文件名

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

我知道这个过程的基本轮廓是:

  • 生成所有文件的校验和列表,通过F1递归
  • 对F2进行同样的操作
  • 比较列表并生成校验和的负交集,忽略文件名,以查找F1中但不在F2中的文件
  • 我有点被困在那个阶段,所以我很感激任何关于使用哪种工具的建议。我想我需要使用“comm”命令来比较文件校验和列表,但是由于md5sumsha512sum等将文件名放在校验和旁边,因此我无法找到一种方法来进行有用的比较。也许awk是正确的选择

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


    谢谢。

    也许可以查看FSLint的源代码以获取指针:

    关于F1:

    # find / -type f -exec md5sum {} + > F1
    
    在F2上:

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


    您可能需要检查
    find
    的更多选项,此行仅查找常规文件。

    您可以执行以下操作:

    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
    
    f1#查找您的rootdir-type f-exec sha1sum{}>>初始文件\;
    f1#…将初始文件复制到机器f2。。。
    f1#…开始复制。。。
    f2#查找您的NewRootDir-type f-exec sha1sum{}>>最终文件\;
    f2#对初始文件进行排序_文件>初始
    f2#对最终文件进行排序#最终文件
    
    f2#对于'comm-23中的sha1,谢谢user362458,这很有用-但是因为'md5sum'将文件名放在校验和旁边,文件'F1'中的任何一行都不会与'f2'中的任何一行匹配,即使校验和相同。啊,我读你的帖子有点太快了,如果创建了一个新的hier,你就必须使用底部的Unknown's之类的解决方案,最好没有UUOC;)看看这个:这绝对是伟大的-正是我想要的。工作做得很好:)嗨,未知,我已经把你的解决方案制作成一个脚本,并在GPL下授权。我希望这对你来说没问题——这似乎是确保任何人都能使用它的最佳方式。如果有问题,请告诉我,我会把它取下来。别担心,这不像是什么绝密算法……)
    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