Я хочу запустить команду Linux, которая будет рекурсивно сравнивать две директории и выводить только имена файлов, которые отличаются. Это включает в себя все, что присутствует в одном каталоге, а не в другом или наоборот, и текстовые различия.
linux
command-line
diff
barfoon
источник
источник
diff
справочная страница в CentOS 7 описывается-q
как «отчет, только если файлы различаются», что менее понятно, чем то, что вы написали.-x PATTERN
в команду исключение определенных подкаталогов. Например,diff -qr repo1 repo2 -x ".git"
сравнивает две директории, но исключает пути к файлам с «.git» в них.Вы также можете использовать rsync
источник
--size-only
пропустит файлы одинакового размера, но разного содержания, например old / version.txt "29a" new / version.txt "29b" . Вместо этого используйте:rsync -ric --dry-run old/ new/
где аргумент "-i" позволяет получить список файлов напрямую черезrsync -ric --dry-run old/ new/ | cut -d" " -f 2
Если вы хотите получить список файлов, которые находятся только в одном каталоге, а не их подкаталогах и только их именах файлов:
Если вы хотите рекурсивно перечислить все файлы и каталоги, которые отличаются своими полными путями:
Таким образом, вы можете применять различные команды ко всем файлам.
Например, я мог бы удалить все файлы и каталоги, которые находятся в dir1, но не в dir2:
источник
В моей системе Linux, чтобы получить только имена файлов
источник
audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
diff -qrN /dir1 /dir2 | cut -f2 -d' '
у меня отлично работает!Подход запуска
diff -qr old/ new/
имеет один существенный недостаток: он может пропускать файлы во вновь создаваемых каталогах. Например, в приведенном ниже примере файлаdata/pages/playground/playground.txt
нет в выводе,diff -qr old/ new/
тогда как в каталогеdata/pages/playground/
(найдите для быстрого просмотра plays.txt в вашем браузере). Я также разместил следующее решение на Unix & Linux Stack Exchange , но скопирую его и здесь:Чтобы создать список новых или измененных файлов программно, лучшее решение, которое я мог бы предложить, - это использовать 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
источник
diff new/ old/
), чтобы увидеть, какие каталоги были удалены?diff -qr new/ old/
приведенного выше примера с докувики tars дает тот же результат, что иdiff -qr old/ new/
- т.е. вы видите, что каталог новый / отсутствует, но нет файлов в немисточник