Как различать имена файлов в двух каталогах (без записи в промежуточные файлы)?

31

Я пытаюсь сделать что-то вроде:

diff `ls -1a ./dir1` `ls -1a ./dir2`

Но это не работает по понятным причинам. Есть ли лучший способ добиться этого (в 1 строке), чем этот?

ls -1a ./dir1 > lsdir1
ls -1a ./dir2 > lsdir2
diff lsdir1 lsdir2

Благодарность

bguiz
источник

Ответы:

47

Вы были близки В bash вы хотите подстановку процессов , а не подстановку команд:

diff <(ls -1a ./dir1) <(ls -1a ./dir2)
Игнасио Васкес-Абрамс
источник
Процесс замены не требуется, однако. Ответ ниже ( superuser.com/a/228773/566289 ) находится на точке!
января
За исключением того, что ответ различает содержание, а не имена файлов!
проиграл
10
diff -rq dir1 dir2

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

fseto
источник
3
@festo: Вы упустили смысл этого вопроса, на самом деле я не хочу анализировать содержимое файлов, я хочу ls
анализировать
+1, на самом деле, я получил тот же вывод с одним предупреждением, diff -rq сообщил о связанном файле как «Нет такого файла или каталога». Итак, плюс один для правильного и откровенно более простого использования. (даже если ответ IVA является лучшей «возможностью обучения» для замены процесса (> _ <)
xtian
1
Это намного медленнее, чем различие в именах файлов: весь файл должен быть прочитан и сравнен.
Заз
@ Джош, конечно, потому что это происходит рекурсивно ....
Брайам
1
@Braiam: Даже если вы рекурсивно различаете имена файлов (например, rsyncс помощью --dry-runопции), это все равно будет намного быстрее, чем diff -r.
Заз