Учитывая Баш, это может быть проще всего, как
$ comm <(ls -a dir1) <(ls -a dir2)
В <(command)
пробегах выражения команды над трубой и заменяют /dev/fd
ссылку:
mress:10018 Z$ echo <(ls)
/dev/fd/11
Таким образом, вышеприведенная команда выполняется ls -a
в каждом каталоге и передает свои выходные данные в качестве аргументов файла comm
, что выводит до 3 столбцов с отступом табуляции: записи только в первом, записи в обоих, записи во втором. (То есть, если он находится в обоих, то он имеет отступ для вкладки, если он только во второй, он имеет отступ для двух вкладок.) Вы также можете подавить столбцы по номерам: comm -1 foo bar
отображаются только строки в обоих и строки во втором файле, последний с отступом на одну вкладку. (Это чаще всего используется, подавляя все, кроме нужного вам столбца: comm -13 foo bar
показывает только общие линии.)
Учитывая, что вы хотите, чтобы те в первом каталоге, что переводится как
$ comm -23 <(ls -a dir1) <(ls -a dir2)
Если вам нужно больше, чем просто diff -r
наличие , используйте , который выведет diff для файлов общего характера и однострочное сообщение для файлов, найденных только в одном или другом.
ls
придет со всеми проблемами с пробелами, вкладками, переводами строк, возвратами и так далее в именах файлов.ls -b
.find
. Но моя главная жалоба наfind
то, что это действительно тяжелая кувалда, чтобы ударить то, что обычно довольно маленькая муха.И тут чистый сценарий. Это каталоги А и В:
Вот команда:
вывод:
Поменяйте местами a и b для файлов в a, но не в b. ! это отрицание. Тесты на существование. В прозае: «Проверьте, не существует ли файл, найденный в a в ../b».
Примечание: вы должны погрузиться в первую очередь, чтобы получить имена без «а». Для второго сравнения вы должны CD
../b
.источник
Если вы предпочитаете графический инструмент, используйте
вам может понадобиться установить его в первую очередь. Подобные программы
Полуночный командир имеет
compare directories
встроенную команду, которая работает хорошо, если вы не выбираете подкаталоги.источник
Вы можете использовать запущенную
join
команду. Вот некоторые настройки для двух примеров каталогов, d1 / и d2 /, каждый из которых имеет несколько файлов с именами, уникальными для каталога, и некоторые файлы с именами, общими с другим каталогом. Это только пример, поэтому я использовал однобуквенные имена файлов, чтобы проиллюстрировать имена файлов, уникальные для одного или другого, и общие имена файлов.Для меня это показывает такие файлы:
ОБНОВЛЕНИЕ: Вы хотели бы сделать разные вещи в реальной жизни, чтобы разместить файлы с пробелами в них, так как
join
использует первое поле «разделенные пробелами», чтобы решить, какие строки являются уникальными, а какие - общими.источник
join -t ''
(без разделителя) поможет в этом случае.d2/f
ноd2/f
. Вкладки и новые строки в именах файлов встречаются редко, но разрешены.Вы можете использовать
find
и,awk
чтобы решить это.Со следующим макетом:
Первая часть:
Часть вторая:
Это сравнивается с
comm
решением:И к
join
решению:источник
использовать мои функции:
источник