У меня есть два каталога с одним и тем же списком файлов. Мне нужно сравнить все файлы, присутствующие в обоих каталогах, с помощью команды diff
. Есть ли простая опция командной строки, или мне нужно написать оболочку script, чтобы получить список файлов, а затем перебрать их?
Файлы Diff присутствуют в двух разных каталогах
Ответ 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