【问题标题】:Finding missing files by checksum通过校验和查找丢失的文件
【发布时间】:2010-06-09 13:05:49
【问题描述】:

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

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

我知道这个过程的基本大纲是:

  1. 通过 F1 递归生成所有文件的校验和列表
  2. 对 F2 执行相同操作
  3. 比较列表并生成校验和的负交集,忽略文件名,以查找 在 F1 中但不在 F2 中的文件。

我有点难以超越那个阶段,所以我很感激任何关于使用哪些工具的指示。我想我需要使用 'comm' 命令来比较文件校验和列表,但是由于 md5sum、sha512sum 等将文件名放在校验和旁边,我看不出有办法让它给我带来有用的比较。也许 awk 是要走的路?

我使用的是 Red Hat Enterprise Linux 5.x。

谢谢。

【问题讨论】:

标签: linux shell scripting checksum


【解决方案1】:

你可以这样做:

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。

【讨论】:

  • 太棒了——正是我想要的。这项工作做得很好:)
  • 您好未知,我已将您的解决方案制作成脚本,并根据 GPL 许可。我希望这对你来说没问题 - 这似乎是确保任何人都可以使用它的最佳方式。如果这是一个问题,请告诉我,我会删除它。 github.com/capncodewash/Misc-shell-scripts/blob/master/…
  • 别担心,这不是什么绝密算法.. :)
【解决方案2】:

在 F1 上:

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

在 F2 上:

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

然后:

# diff F1 F2

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

【讨论】:

  • 感谢 user362458,这很有用 - 但是因为 'md5sum' 将文件名放在校验和旁边,所以文件 'F1' 中的任何行都不会匹配 'F2' 中的任何行,即使校验和是相同的。
  • 啊,我读你的帖子有点太快了,如果创建了一个新的hier,你必须在底部寻找一个像Unknown's这样的解决方案,最好没有UUOC ;)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多