所以,我刚刚买了一个新的 4TB SSHD,我会在 2015 年 5 月 26 日之前让技术人员在我家安装它。为了备份我的东西,我买了一个 4TB 外置硬盘,并决定将我的内置硬盘和 3TB 硬盘中的所有内容复制到我的 4TB 硬盘上。我成功地复制了 1TB,但在复制过程中我不小心取消了 3TB 的传输 - 我使用的是 nautilus - 我想验证文件的完整性,因为我不知道我的 3TB 硬盘是如何快速填满的,我只想在检查完完整性后删除上面的所有内容。为了检查完整性,我不想重新格式化硬盘,因为我这里有一些多余的文件,而其他硬盘上没有。我想让一个命令解析“目录 a”中每个文件的路径,就好像它是 chrooted 的一样,然后验证文件是否存在于“目录 b”中,并且具有相同的哈希值和大小。如果哈希值不同、大小不同或者文件不存在于“目录 b”中,它将再次复制该文件。以下是示例。
假设目录 A 位于 /a 上,目录 b 位于 /b 上。如果有一个 500KB 的文件,其路径为 /a/eevee.png,则它会认为 /b/eevee.png 存在且大小为 500KB,且哈希值相同。如果不存在、大小不是 500KB 和/或哈希值不同,它会复制文件并覆盖,而无需询问。
另外,还有一个可选功能。如果目录 a 中的文件与目录 b 中的文件匹配(如我之前所述),但时间戳不同,则目录 b 中的文件的时间戳将更改为目录 a 中的时间戳。
答案1
我实际上通过大量研究找到了一种方法,但在发布这篇文章之前没有深入挖掘。我想在这篇文章中引用它这里(在 Ubuntu 论坛上,而不是 Ask Ubuntu)。用户 papibe 评论道:
何约翰尼男孩史密斯。
它看起来像是‘rsync’的工作。
默认情况下,rsync 会根据修改时间和大小来复制和更新文件。但是,你可以指定仅检查文件大小。
例如:
rsync -av --size-only source/ destination/
希望对您有所帮助。请告诉我们进展如何。谢谢。
答案2
这是我用于验证两个文件夹中文件的粗略脚本,如果任何文件有问题 - 将其复制过来。我建议使用这个后复制文件。
基本思想是用于hexdump
验证文件。该脚本以两个目录作为输入。局限性:它只处理目录内的文件,而不是子目录(因为我还不知道该怎么做)。因此,如果您没有那么多文件夹,则可以使用它,但是如果您有多个文件夹和子文件夹,则为每个目录手动运行脚本可能会很繁琐。未来思考的内容:创建文件夹和子文件夹列表用于源和目标,然后自动执行脚本遍历这两个列表。
脚本运行
我将 tester2 作为源目录,将 testerdir 作为目标目录,我已经在其中复制了文件。在第 123 行,我运行脚本来验证正在复制的文件。在第 124 行,我更改了 tester2/hello 文件的内容(将其内容从“TEST”更改为“TESTER”)。在第 125 行,您可以看到脚本检测到文件 hello 已被更改/大小已更改/已损坏,并再次复制该文件。在第 126 行,您可以看到我验证目标文件夹中的 hello 文件是否与源文件夹中的 hello 文件匹配。
脚本
#!/bin/bash
# Author: Serg Kolo
# Date: Mon May 25 01:19:59 MDT 2015
# Description: script to verify files in two directories
# written for http://askubuntu.com/q/627817/295286
copy_the_file ()
{
cp -f "$SOURCE_DIR"/"$filename" "$DEST_DIR"/"$filename"
}
if [ $# -ne 2 ]; then
printf "Usage: verify-files.sh SOURCE_DIR DEST_DIR"
exit 1
fi
SOURCE_DIR="$1"
DEST_DIR="$2"
IFS=":"
for filename in $(find "$SOURCE_DIR" -maxdepth 1 -type f -printf "%f:" | sed 's/.\///g' )
do
#echo "$filename"
#echo "$DEST_DIR"/"$filename"
if [ -e "$DEST_DIR"/"$filename" ];then
hexdump "$SOURCE_DIR"/"$filename" > .dump1
hexdump "$DEST_DIR"/"$filename" > .dump2
diff .dump1 .dump2 > /dev/null
if [ $? -eq 0 ];then
echo " "$filename" is OK "
else
echo ""$filename" has a problem"
copy_the_file
fi
else
copy_the_file
fi
done