Wie werden Dateinamen in zwei Verzeichnissen unterschieden (ohne in Zwischendateien zu schreiben)?

31

Ich versuche etwas in der Art von:

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

Aber das funktioniert aus offensichtlichen Gründen nicht. Gibt es einen besseren Weg, dies zu erreichen (in einer Zeile), als dies?

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

Vielen Dank

bguiz
quelle

Antworten:

47

Du warst nah. In der Bash möchten Sie die Prozessersetzung , nicht die Befehlssubstitution:

diff <(ls -1a ./dir1) <(ls -1a ./dir2)
Ignacio Vazquez-Abrams
quelle
Eine Prozessersetzung ist jedoch nicht erforderlich. Die Antwort unten ( superuser.com/a/228773/566289 ) ist richtig !
Jan D
Bis auf diese Antwort unterscheidet sich der Inhalt, nicht die Dateinamen!
verloren
10
diff -rq dir1 dir2

Gehen Sie mit der Option -r ganze Verzeichnisbäume durch und überprüfen Sie rekursiv die Unterschiede zwischen Unterverzeichnissen und Dateien, die an vergleichbaren Stellen in jedem Baum auftreten. Der Trick besteht darin, die Option -q zu verwenden, um zeilenweise Vergleiche zu unterdrücken

fseto
quelle
3
@festo: Ihnen fehlt der Punkt dieser Frage, ich möchte eigentlich nicht den Inhalt der Dateien unterscheiden, ich möchte die Ausgabe der lsBefehle unterscheiden
bguiz
+1, Eigentlich habe ich die gleiche Ausgabe mit der einen Einschränkung erhalten, diff -rq hat eine verknüpfte Datei als 'Keine solche Datei oder Verzeichnis' gemeldet. Also, plus eins für eine korrekte und ehrlich gesagt einfachere Verwendung. (Auch wenn die Antwort von IVA eine bessere "Lernmöglichkeit" für die Prozessersetzung ist (> _ <)
18.
1
Dies ist viel langsamer als das Vergleichen der Dateinamen: Die Gesamtheit jeder Datei muss gelesen und verglichen werden.
Zaz
@ Josh natürlich, weil es rekursiv tut ....
Braiam
1
@Braiam: Auch wenn Sie die Dateinamen rekursiv unterscheiden ( z. B. rsyncmit der --dry-runOption), ist dies immer noch viel schneller als diff -r.
Zaz