Angesichts der Bash könnte dies am einfachsten sein
$ comm <(ls -a dir1) <(ls -a dir2)
Der <(command)
Ausdruck führt den Befehl über eine Pipe aus und ersetzt eine /dev/fd
Referenz:
mress:10018 Z$ echo <(ls)
/dev/fd/11
Der obige Befehl wird also ls -a
für jedes Verzeichnis ausgeführt und gibt seine Ausgaben als Dateiargumente an comm
, die bis zu 3 Spalten mit Tabulatoren ausgeben: Einträge nur im ersten, Einträge in beiden, Einträge im zweiten. (Das heißt, wenn es in beiden ist, wird es durch eine Registerkarte eingerückt, wenn es nur in der Sekunde ist, wird es durch 2 Registerkarten eingerückt.) Sie können Spalten auch nach Zahlen unterdrücken: comm -1 foo bar
Zeigt nur die Zeilen in beiden und Zeilen in der zweiten Datei an. Letzteres wird durch eine Registerkarte eingerückt . (Dies wird am häufigsten verwendet, indem alle außer der gewünschten Spalte unterdrückt werden: Es comm -13 foo bar
werden nur die gemeinsamen Zeilen angezeigt.)
Vorausgesetzt, Sie möchten diese im ersten Verzeichnis, übersetzt das in
$ comm -23 <(ls -a dir1) <(ls -a dir2)
Wenn Sie mehr als nur benötigen, ob es vorhanden ist, verwenden Sie diff -r
, um Unterschiede für die gemeinsamen Dateien und eine einzeilige Nachricht für Dateien auszugeben, die nur in der einen oder der anderen gefunden werden.
ls
wird mit allen Problemen mit Leerzeichen, Tabulatoren, Zeilenvorschüben, Backspaces und dergleichen in Dateinamen kommen.ls -b
.find
. Aber meine Hauptbeschwerdefind
ist, dass es ein sehr schwerer Vorschlaghammer ist, eine normalerweise eher kleine Fliege zu schlagen.Und hier ein reines Drehbuch. Dies sind die Verzeichnisse a und b:
Hier ist der Befehl:
Ausgabe:
Tauschen Sie a und b gegen Dateien in a, aber nicht in b. Das ! ist eine Negation. -e testet auf -existenz. In prosa: "Teste, ob die in a in ../b gefundene Datei nicht vorhanden ist".
Hinweis: Sie müssen in eine erste eintauchen, um Namen ohne 'a' zu erhalten. Für den zweiten Vergleich muss man cd
../b
.quelle
Wenn Sie ein grafisches Werkzeug bevorzugen, verwenden Sie
Möglicherweise müssen Sie es zuerst installieren. Ähnliche Programme sind
Der Mitternachtskommandant hat einen
compare directories
eingebauten Befehl, der gut funktioniert, wenn Sie keine Unterverzeichnisse wählen.quelle
Sie können den vernachlässigten
join
Befehl verwenden. Hier einige Einstellungen für zwei Beispielverzeichnisse, d1 / und d2 /, von denen jedes einige Dateien mit Namen enthält, die für das Verzeichnis eindeutig sind, und einige Dateien mit Namen, die mit dem anderen Verzeichnis gemeinsam sind. Dies ist nur ein Beispiel, daher habe ich Dateinamen mit einem Buchstaben verwendet, um Dateinamen zu veranschaulichen, die für den einen oder anderen eindeutig sind, sowie gemeinsame Dateinamen.Für mich zeigt es Dateien wie diese:
UPDATE: Sie möchten im wirklichen Leben verschiedene Dinge tun, um Dateien mit Leerzeichen aufzunehmen, da
join
das erste Feld "durch Leerzeichen begrenzt" verwendet, um zu entscheiden, welche Zeilen eindeutig und welche Zeilen gemeinsam sind.quelle
join -t ''
(kein Trennzeichen) diesem Fall helfen.d2/f
aberd2/f
. Tabulatoren und Zeilenumbrüche in Dateinamen sind selten, aber zulässig.Sie können dies verwenden
find
undawk
lösen.Mit folgendem Layout:
Teil eins:
Zweiter Teil:
Dies ist vergleichbar mit einer
comm
Lösung:Und zu einer
join
Lösung:quelle
benutze meine Funktionen:
quelle