Файлы Diff присутствуют в двух разных каталогах

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

Ответ 1

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

diff -bur folder1/ folder2/

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

  • b флаг означает игнорирование пробелов
  • u флаг означает единый контекст (3 строки до и после)
  • флаг r означает рекурсивный

Ответ 2

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

diff -qr dir_one dir_two | sort

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

Ответ 3

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

diff -r dir1 dir2

Ответ 4

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

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

Ответ 5

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

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

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

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

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

Ответ 6

Вот 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" )

Ответ 7

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

diff -rq /path/to/folder1 /path/to/folder2