Разные файлы представлены в двух разных каталогах - PullRequest
262 голосов
/ 07 января 2010

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

Ответы [ 7 ]

379 голосов
/ 07 января 2010

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

diff -bur folder1/ folder2/

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

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

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

diff -qr dir_one dir_two | sort

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

18 голосов
/ 07 января 2010

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

diff -r dir1 dir2

10 голосов
/ 07 января 2010

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

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...
3 голосов
/ 07 января 2010

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

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

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

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

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

0 голосов
/ 06 июня 2017

Попробуйте это:

diff -rq /path/to/folder1 /path/to/folder2      
0 голосов
/ 17 февраля 2016

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