Разные файлы представлены в двух разных каталогах

186

У меня есть два каталога с одним и тем же списком файлов. Мне нужно сравнить все файлы, присутствующие в обоих каталогах, с помощью команды diff. Есть ли простая опция командной строки, или мне нужно написать оболочку script, чтобы получить список файлов, а затем перебрать их?

Теги:
diff

7 ответов

292
Лучший ответ

Вы можете использовать команду diff для этого:

diff -bur folder1/ folder2/

Это выведет рекурсивный diff, игнорирующий пробелы, с единым контекстом:

  • b флаг означает игнорирование пробелов
  • u флаг означает единый контекст (3 строки до и после)
  • флаг r означает рекурсивный
  • 8
    Вы можете получить доступ к команде diff , загрузив утилиты GNU для Win32 .
  • 6
    Я также обнаружил, что опция --brief полезна; вы получаете список измененных файлов и можете обрабатывать их отдельно
Показать ещё 5 комментариев
67

Если вам интересны только файлы, которые отличаются друг от друга, вы можете использовать:

diff -qr dir_one dir_two | sort

Опция "q" будет показывать только файлы, которые отличаются, но не отличается от содержимого, а "сортировка" будет упорядочивать выход в алфавитном порядке.

  • 1
    Это просто супер! Также работает эффективно - то есть, если целый подкаталог существует только в одном из каталогов, он перестает повторяться в нем и сообщает только о самом подкаталоге (без его преемника содержимого). очень хорошо!!
  • 0
    -q вариант человек !! Я люблю тебя.
16

У Diff есть опция -r, которая предназначена именно для этого.

diff -r dir1 dir2

9

diff может не только сравнивать два файла, он может, используя опцию -r, прогуливать целые деревья каталогов, рекурсивно проверять различия между подкаталогами и файлами, которые встречаются в сопоставимых точках в каждом дереве.

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...
3

Если это GNU diff, вы должны просто указать его в двух каталогах и использовать параметр -r.

В противном случае попробуйте использовать

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

N.B. Как отметил Деннис в разделе комментариев, вам фактически не нужно выполнять подстановку команд на ls. Я делаю это так долго, что я довольно много делаю это на автопилоте и заменяю команду, мне нужно получить список файлов для сравнения.

Также я забыл добавить, что я делаю "\ ls", чтобы временно отключить мой псевдоним ls для GNU ls, чтобы я потерял информацию о форматировании цвета из списка, возвращаемого GNU ls.

  • 2
    Нет необходимости использовать ls : for i in ./dir1/*
  • 1
    @ Денис, прикольный ярлык. +1. Я так привык выполнять подстановку команд, хотя она автоматическая, и я просто использую любую нужную мне команду, например, иногда я использую find. Использование ls также позволяет мне больше использовать список dir, например, обратное время вместо последовательности по умолчанию.
0

Попробуйте следующее:

diff -rq /path/to/folder1 /path/to/folder2      
  • 1
    Это дублирует существующий ответ и не добавляет новый контент. Пожалуйста, не публикуйте ответ, если у вас нет чего-то нового.
0

Вот script, чтобы показать различия между файлами в двух папках. Он работает рекурсивно. Измените dir1 и dir2.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню