我定期将数据备份到外部硬盘驱动器,在过去,一些文件最终被损坏,我没有注意到它,直到为时已晚。因此,为了防止这种情况,我想为外部硬盘驱动器上的所有文件创建一个 md5 校验和。现在,随着时间的推移,新文件可能最终会被添加,旧文件可能最终会被删除。我当前正在运行 Linux Mint,并且我已经能够使用以下命令创建一个文本文件,其中包含外部硬盘驱动器上所有文件的 md5 总和:
find '/path/to/backup/' -type f -exec md5sum {} \;>> /path/to/checksum.md5
现在我很久以前从一个网站上得到了这个,我不太熟悉一切的含义,如果有人能解释该命令的每个部分的作用,我将不胜感激。话虽这么说,上面的命令总是会重新哈希整个硬盘驱动器,并且随着硬盘驱动器大小的增加,完成所需的时间会越来越长。因此,我想找到一种方法来简单地在硬盘驱动器上附加新文件,而不必重新开始对整个硬盘驱动器进行哈希处理。过去,我使用以下命令来执行此操作,它似乎工作得很好,直到最近:
find 'path/to/backup' -type f -cnewer 'path/to/old/checksum/' -exec md5sum {} + > path/to/appended/checksum/
sort -k 2 -u /path/to/old/checksum path/to/appended/checksum > path/to/new/checksum.md5
由于某种原因,上面不再找到新添加的文件,并且附加的校验和文件中没有条目。任何人都知道如何解决这个问题,或者也许有更好的方法来完成我想做的事情?
还有一种方法可以使用 find 命令以某种方式扫描备份目录,忽略 md5 文件中已有的任何目录,并仅显示上次校验和后添加的文件?
答案1
之后的参数-cnewer
可能是你的问题:
find
应该找到比 -cnewer 之后给出的文件的文件日期更新的文件。- 看来你放了一个目录。所以第一部分应该是:
find 'path/to/backup' -type f -cnewer '/path/to/checksum.md5'
第二部分是exec
函数。
从
man find
你那里得到:-exec command {} ;
执行命令(在你的情况下:md5sum
) 其中字符串{}
被当前文件名替换。对于每个匹配的文件,指定的命令运行一次。-exec command {} +
对选定的文件运行指定的命令,但命令行是通过在末尾附加每个选定的文件名来构建的;该命令的调用总数将远小于匹配的文件数。如果find
遇到错误,有时会导致立即退出,因此某些挂起的命令可能根本无法运行。所以问题可能是文件太多,或者在 while 期间
find
出现错误。
因此我建议:
# Delete file /path/to/appended_checksum.md5 as we 'add' text to it.
rm /path/to/appended_checksum.md5
find 'path/to/backup' -type f -cnewer '/path/to/checksum.md5' -exec md5sum {} \;>> '/path/to/appended_checksum.md5'
sort -k 2 -u '/path/to/checksum.md5' '/path/to/appended_checksum.md5' > path/to/new_checksum.md5