是否有可能有一个 md5 校验和文件(如从某样东西生成的,md5sum -r * > checklist.chk
其中每行只包含文件的哈希值和文件名(而不是从当前目录到文件的路径)?
我有两个想要比较的大目录树,但第二个目录树的结构不同,因为我更频繁地使用它,并且随着时间的推移一直在慢慢地重新排列它。我很好奇是否有可能md5sum
检查第一个目录树中的所有文件,看它们是否与第二个目录树中某个文件具有相同的文件名和哈希值。
到目前为止我发现的大多数帖子似乎都没有涉及文件路径无关紧要的这种用例。
本质上,我希望能够做到这一点:
- 打开第二个目录树并生成校验和列表(使用类似的方法
md5sum -r * > checklist.chk
,但每行仅包含文件的哈希值和名称(不包含路径) - 打开第一个目录树并遍历每个文件,并根据步骤 1 中的校验和列表验证其哈希值,以确定它们是否存在于第二个目录树中。
答案1
我想到的最自动化的方式是阅读man find xargs md5sum sort uniq
并执行类似以下未经测试的代码:
find sourcedir oldsourcedir -type f -print0 | \
xargs -r -0 md5sum | \
sort | uniq -c -w 32 | \
sort -nr | tee md5sums.txt | \
less
答案2
经过一番搜索,我似乎找到了脚本这似乎正是这样做的:
#!/bin/bash
#for merging dir1 into dir2
maindir=$(pwd)
dir1="$1"
d1checkfilename="dir1.flatchecksum"
dir2="$2"
d2checkfilename="dir2.flatchecksum"
resultfile="result.txt"
create_flat_checksum () {
local currentdir="$1"
local checksumfile="$2" # input needs a leading ./
touch "$checksumfile"
echo "now checksumming $currentdir"
local subdirs=$(find "$currentdir" -type d)
# echo "$subdirs"
while read -r line; do
echo "$line"
cd "$line"
#run the checksum and redirect errors to stderr (ignoring them)
local result=$(md5sum * 2> /dev/null)
# append the results of this directories checksum to the main file
echo "$result" >> "$maindir/$checksumfile"
# cd back up to current dir for next iteration
# echo "$maindir/${currentdir:2}"
# pwd
# echo "$maindir/${currentdir:2}"
cd "$maindir"
done <<< "$subdirs"
}
# create flat checksum files for both directories
create_flat_checksum "$dir1" "$d1checkfilename"
create_flat_checksum "$dir2" "$d2checkfilename"
comm -23 <(sort $d1checkfilename) <(sort $d2checkfilename) > "$resultfile"