我有2个文件。我们称它们为md5s1.txt和md5s2.txt。两者都包含
的输出find -type f -print0 | xargs -0 md5sum | sort > md5s.txt
命令在不同的目录中。许多文件已重命名,但内容保持不变。因此,他们应该有相同的md5sum。我想生成像
这样的差异diff md5s1.txt md5s2.txt
但它应该只比较每一行的前32个字符,即只比较md5sum,而不是文件名。具有相同md5sum的线应该被认为是相等的。输出应采用正常的diff格式。
答案 0 :(得分:15)
简易启动:
diff <(cut -d' ' -f1 md5s1.txt) <(cut -d' ' -f1 md5s2.txt)
另外,请考虑
diff -EwburqN folder1/ folder2/
答案 1 :(得分:2)
仅使用diff
上的<(cut -c -32 md5sums.sort.XXX)
比较md5列,并使用diff
告诉--old/new-line-format='%dn'$'\n'
仅打印添加或删除的行的行号。将其传递到ed md5sums.sort.XXX
,以便它只打印md5sums.sort.XXX
文件中的那些行。
diff \
--new-line-format='%dn'$'\n' \
--old-line-format='' \
--unchanged-line-format='' \
<(cut -c -32 md5sums.sort.old) \
<(cut -c -32 md5sums.sort.new) \
| ed md5sums.sort.new \
> files-added
diff \
--new-line-format='' \
--old-line-format='%dn'$'\n' \
--unchanged-line-format='' \
<(cut -c -32 md5sums.sort.old) \
<(cut -c -32 md5sums.sort.new) \
| ed md5sums.sort.old \
> files-removed
ed
的问题在于它会将整个文件加载到内存中,如果你有很多校验和,这可能是个问题。不要将diff的输出传递给ed
,而是将其输入到以下命令中,这将使用更少的内存。
diff … | (
lnum=0;
while read lprint; do
while [ $lnum -lt $lprint ]; do read line <&3; ((lnum++)); done;
echo $line;
done
) 3<md5sums.sort.XXX
答案 2 :(得分:1)
如果您要查找重复文件,fdupes可以为您执行此操作:
$ fdupes --recurse
在ubuntu上你可以通过
安装它$ apt-get install fdupes