Jak różnicować nazwy plików w dwóch katalogach (bez zapisu do plików pośrednich)?

31

Staram się zrobić coś w stylu:

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

Ale to nie działa z oczywistych powodów. Czy istnieje lepszy sposób na osiągnięcie tego (w 1 linii) niż ten?

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

Dzięki

bguiz
źródło

Odpowiedzi:

47

Byłeś blisko W bashu chcesz zastąpienia procesu , a nie polecenia:

diff <(ls -1a ./dir1) <(ls -1a ./dir2)
Ignacio Vazquez-Abrams
źródło
Zastąpienie procesu nie jest jednak konieczne. Odpowiedź poniżej ( superuser.com/a/228773/566289 ) jest słuszna!
Jan D
Tyle że odpowiedź różni treść, a nie nazwy plików!
stracił
10
diff -rq dir1 dir2

korzystając z opcji -r, chodź po całych drzewach katalogów, rekurencyjnie sprawdzając różnice między podkatalogami i plikami, które występują w porównywalnych punktach w każdym drzewie. Sztuką jest użycie opcji -q, aby ukryć porównania linia po linii

fseto
źródło
3
@festo: Nie chcesz poitacji tego pytania, tak naprawdę nie chcę różnicować zawartości plików, chcę różnicować dane wyjściowe lspoleceń
bguiz
+1, Właściwie to otrzymałem to samo wyjście z jednym zastrzeżeniem, diff -rq zgłosiło połączony plik jako „Brak takiego pliku lub katalogu”. Plus jeden za prawidłowe i szczerze prostsze użytkowanie. (nawet jeśli odpowiedź IVA jest lepszą „szansą na naukę” do zastąpienia procesu (> _ <)
xtian
1
Jest to znacznie wolniejsze niż różnicowanie nazw plików: należy odczytać i porównać całość każdego pliku.
Zaz
@Josh oczywiście, ponieważ robi rekurencyjnie ....
Braiam
1
@Braiam: Nawet jeśli rekurencyjnie różnicujesz nazwy plików (używając na przykład rsyncz tą --dry-runopcją), byłoby to znacznie szybsze niż diff -r.
Zaz