Как создать список измененных файлов программно с помощью инструментов командной строки linux? Меня не интересует разница в каком-либо конкретном файле (дельта, патч). Я просто хочу получить список новых или измененных файлов по сравнению с предыдущим выпуском продукта. Так что я могу опубликовать новое обновление продукта.
обновление: diff -qr
не дает очень удобного вывода. Вывод diff -qr
также должен быть обработан. Есть ли лучший способ?
linux
bash
command-line
diff
Альфа Сизиф
источник
источник
Ответы:
У меня есть простой подход к этому: используйте режим rsync-preview:
Файлы, которые отображаются как «подлежащие удалению» этой командой, будут «новыми» файлами. Другие, которые должны быть переданы, изменились каким-то образом. Смотрите rsync-man-страницу для более подробной информации.
источник
Вы можете использовать diff toool: смотрите параметры -q и -r
Пример:
источник
Only in
которая появляется, даже если каталоги являются идеальными копиями. Мне нужно было сравнить изменения со старой ревизией и в итоге загрузить целую ревизию в отдельный каталог и использовать стандартные инструменты SVN для сравнения. Это, кажется, единственный путь ...В
diffutils
комплект входитlsdiff
инструмент. Просто передайте вывод командыdiff -u
lsdiff:источник
patchutils
упаковке для меня (CentOS 5.x).Я бы просто прикоснулся к файлу во время каждого обновления, а затем вы можете найти файлы, которые были изменены с тех пор с
find /tree/location -newer /last/update/file -print
источник
Чтобы взять только имена файлов, которые они изменили, я использую эту команду:
Если вам необходимо исключить некоторые файлы в виде объектных файлов или библиотечных файлов, вы можете использовать:
источник
Чтобы создать список новых или измененных файлов программно, лучшее решение, которое я мог бы предложить, это использовать rsync , sort и uniq :
Позвольте мне объяснить на этом примере: мы хотим сравнить два выпуска dokuwiki, чтобы увидеть, какие файлы были изменены, а какие были созданы заново.
Мы принести гудроны с Wget и извлечь их в каталогах
old/
иnew/
:Запуск rsync в одну сторону может пропустить вновь созданные файлы, как показывает сравнение rsync и diff:
дает следующий вывод:
Запуск rsync только в одном направлении пропускает вновь созданные файлы, и наоборот, пропустит удаленные файлы, сравните вывод diff:
дает следующий вывод:
Запуск Rsync оба способов и сортировка вывода для удаления дубликатов показывает , что каталог
data/pages/playground/
и файлdata/pages/playground/playground.txt
были пропущены первоначально:дает следующий вывод:
rsync
запускается с этими аргументами:-r
"вербоваться в каталоги",-c
также сравнивать файлы одинакового размера и только «пропускать по контрольной сумме, а не по времени и размеру»,-n
«выполнить пробный запуск без внесения изменений», и--out-format="%n"
«выводить обновления, используя указанный ФОРМАТ», который здесь «% n» только для имени файлаВывод (список файлов)
rsync
в обоих направлениях объединяется и сортируется с использованиемsort
, и этот отсортированный список затем сокращается путем удаления всех дубликатов сuniq
источник
Вы должны получить желаемый результат, используя:
источник
Это может сделать трюк:
источник
Обычно вы помещаете файлы в какую-то систему контроля версий, такую как SubVersion или git, поскольку они могут сделать это для вас из коробки.
Но вы можете сделать быстрый скрипт с циклом for на dir1, а затем сравнить каждый файл с файлом в dir2. Цикл for может посмотреть на код выхода из diff, чтобы узнать, были ли файлы другими.
Может быть, что-то вроде этого:
Примечание. Скрипт не тестировался, поэтому приведенный выше пример - псевдокод в стиле bash ...
Давайте еще раз, но с мерзавцем
Создайте несколько примеров файлов для воспроизведения
Затем введите dir и импортируйте dir1
Выйдите и измените dir1 (чтобы он стал вашим dir2).
Затем перейдите в каталог git и импортируйте новый каталог
Теперь спросите git, что изменилось (с помощью команды status)
Вывод представляет собой список с изменениями, который выглядит следующим образом:
источник
Может быть, ты был бы счастлив с чем-то другим. Попробуй
git
.Сделайте это в качестве примера:
git
будет отслеживать ваши файлы для вас. Командаgit status
покажет вам все файлы, которые были изменены с момента последнего коммита.источник
Это похоже на rsync: показывать, когда новый файл в месте назначения должен быть перезаписан (спрашивается позже, но не является дубликатом).
Как указано в вопросе, "diff -q -r" может потребовать некоторой обработки, чтобы быть полезным. Вопрос не уточнил форму вывода; ответы дают различные типы отчетов.
rsync
является полезным инструментом для этой цели, потому что это гораздо быстрее, чемdiff
. Однако решение, предложенное @nils, гораздо более многословно (и содержит больше файлов), чем фактические различия между старыми / новыми деревьями каталогов. Например, сравнивая это со сценарием, который я написал для этого ответа, и работая с теми же данными,Чтобы
diff
правильно учесть новые файлы, вам также понадобится-N
опция (которую я не вижу ни в одном из предложенных ответов). Тем не менее, поскольку он намного медленнее (на несколько порядков), чемrsync
улучшение выпуска последнего, кажется, путь.дальнейшее чтение
источник
Я всегда был неравнодушен к sha1sum (или даже md5sum; в этом контексте это довольно безопасно).
Иногда - например, если вы переименовываете или перемещаете слишком много файлов - сортировка по первому полю, а затем выполнение diff может помочь, но в большинстве случаев этого достаточно.
Обратите внимание, что по сравнению с некоторыми другими методами это дает то преимущество, что вам не нужно хранить копию файлов «before»; только выходной файл md5sum.
источник