Старая добрая энергия ;) (с сортировкой, просмотром, и т.д.)
vim .
Использовать join
объединить согласующие отрезки длинной линии из этих двух файлов. Принятие имен файлов происходит после контрольных сумм (как в md5sum
вывод), и не содержат пробел, это распечатает все имена файлов, которые присутствуют в обоих списках, вместе со старой контрольной суммой и новой контрольной суммой:
join -1 2 -2 2 <(sort -k 2 oldlist) <(sort -k 2 newlist)
Чтобы также видеть новые файлы передайте -a
опция к join
. Немного выходной постобработки удалит имена файлов, для которых не изменилась контрольная сумма.
join -a 2 -1 2 -2 2 <(sort -k 2 oldlist) <(sort -k 2 newlist) |
awk '$2 != $3'
Вы могли сделать это с awk
один:
$ awk 'FNR==NR { o[$2]=$1; next } !o[$2] { print $0, "NEW"; next }
$1!=o[$2] { print $0, "CHANGED" }' newlist oldlist
(Обратите внимание, что воображаемый формат файлов md5sum
выходной формат: "имя файла md5".)
Обновление: пошаговое объяснение как это awk
работы остроты.
awk 'FNR==NR { # if current record number==overall record number (still processing the first file)
o[$2]=$1 # store the record in array o: the key is the file name, the value is the md5
next # go to next record (do not execute the rest of the code)
}
# reaching this point means we are processing the second input file
!o[$2] { # if array o not contains item with the current record`s file name
print $0, "NEW" # print the current record and specify that it`s new
next # go to next record (do not execute the rest of the code)
}
# reaching this point means array o contains item with the current file name
$1!=o[$2] { # if the current md5 is not equal with the md5 save for the current file name
print $0, "CHANGED" # print the current record and specify it`s changed
}' newlist oldlist
если я понял Ваш вопрос правильно затем comm
может действительно сделать то, что Вы хотите. Я предложил бы изучить comm --help
specificically
-1 suppress column 1 (lines unique to FILE1)
-2 suppress column 2 (lines unique to FILE2)
-3 suppress column 3 (lines that appear in both files)
так comm newFile oldFile -1 -3
сделает то, что Вы хотите.
Предположим, что файлы похожи (разделенное пространство):
file1 md5sum1
file2 md5sum2
Простое решение:
# get only the files:
cut -f 1 -d " " oldlist > oldlist.files
# from newlist, take only files which were also in the oldlist (updated files)
grep -w -F -f oldlist.files newlist > newlist.updated_files
И затем можно просто сравнить эти два файла (после сортировки):
sort -u oldlist > oldlist.su
sort -u newlist.updated_files > newlist.updated_files.su
diff oldlist.su newlist.updated_files.su
В качестве альтернативы я всегда использовал " sdiff -s
" для сравнения списков файлов или md5sums.
Предполагая, что файлы являются нормальными, md5sum выводит " md5hash filename
". Тогда либо:
sdiff -s oldfile newfile | grep -v ">"
# sorting on the md5hash should help align and pick up renamed files.
sdiff -s <(sort oldfile) <(sort newfile)
Разбираем это:sdiff -s
:подавляет общие строки, поэтому точные совпадения игнорируются. Показывает |
, <
, >
для различий. <(sort oldfile)
:команда выполняет сортировку перед sdiff. grep -v ">"
:Игнорировать записи новых файлов. Работает, только если у вас нет >
в имени файла, что в любом случае маловероятно.
Ширина sdiff
может быть изменена для отображения более длинных строк -w 100
.