Як відрізняти імена файлів у двох каталогах (без запису в проміжні файли)?


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 ) суттєва !
січень D

За винятком того, що відповідь відрізняє зміст, а не ім’я!
програв

10
diff -rq dir1 dir2

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


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

+1, насправді, я отримав однаковий вихід із одним застереженням, diff -rq повідомив про зв'язаний файл, як "Немає такого файлу чи каталогу". Отже, плюс один за правильне та відверто спрощене використання. (навіть якщо відповідь IVA - краща "можливість навчання" для заміщення процесу (> _ <)
xtian

1
Це набагато повільніше, ніж розмежування назв файлів: цілість кожного файлу повинна бути прочитана та порівняна.
Заз

@Josh звичайно, тому що це робить рекурсивно ....
Брайам

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