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


31

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

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

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

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

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

Ответы:


47

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

diff <(ls -1a ./dir1) <(ls -1a ./dir2)

Процесс замены не требуется, однако. Ответ ниже ( superuser.com/a/228773/566289 ) находится на точке!
января

За исключением того, что ответ различает содержание, а не имена файлов!
проиграл

10
diff -rq dir1 dir2

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


3
@festo: Вы упустили смысл этого вопроса, на самом деле я не хочу анализировать содержимое файлов, я хочу ls
анализировать

+1, на самом деле, я получил тот же вывод с одним предупреждением, diff -rq сообщил о связанном файле как «Нет такого файла или каталога». Итак, плюс один для правильного и откровенно более простого использования. (даже если ответ IVA является лучшей «возможностью обучения» для замены процесса (> _ <)
xtian

1
Это намного медленнее, чем различие в именах файлов: весь файл должен быть прочитан и сравнен.
Заз

@ Джош, конечно, потому что это происходит рекурсивно ....
Брайам

1
@Braiam: Даже если вы рекурсивно различаете имена файлов (например, rsyncс помощью --dry-runопции), это все равно будет намного быстрее, чем diff -r.
Заз
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.