Сравните только столбец md5, используя diff
на <(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