it-roy-ru.com

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

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

261
Sudar

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

diff -bur folder1/ folder2/

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

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

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

diff -qr dir_one dir_two | sort

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

101
Suresh

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

diff -r dir1 dir2

18
CodeRain

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

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...
10
miku

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

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

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

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

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

3
Rob Wells

Вот скрипт, чтобы показать различия между файлами в двух папках. Работает рекурсивно. Измените 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" )
0
Evgeny Karpov