diff
使用on仅比较 md5 列<(cut -c -32 md5sums.sort.XXX)
,并告诉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