Ich versuche, die in einem Verzeichnis vorhandenen Dateien zu finden, aber nicht im anderen. Ich habe versucht, diesen Befehl zu verwenden:
diff -q dir1 dir2
Das Problem mit dem obigen Befehl, dass es sowohl die Dateien in dir1
aber nicht in dir2
als auch die Dateien in dir2
aber nicht in findet dir1
,
Ich versuche, die Dateien in zu finden, dir1
aber nicht dir2
nur in.
Hier ist eine kleine Auswahl meiner Daten
dir1 dir2 dir3
1.txt 1.txt 1.txt
2.txt 3.txt 3.txt
5.txt 4.txt 5.txt
6.txt 7.txt 8.txt
Eine andere Frage in meinem Kopf ist, wie ich die Dateien in, dir1
aber nicht in dir2
oder dir3
in einem einzelnen Befehl finden kann.
grep
für etw^dir1
sicherstellen, dass ichdir1
später auf dem Weg nicht auftauche.$4
als Beispiel. In der Tat, auf meinem aktuellen Ubuntu,diff
antwortet auf Italienisch.$4
ist in Ordnung für italienische und englische Antworten, aber ich bin mir nicht sicher für alle anderen Sprachen ...Dies sollte den Job machen:
Optionen erklärt (über die Manpage diff (1) ):
-r
- Vergleichen Sie alle gefundenen Unterverzeichnisse rekursiv.-q
- Nur ausgeben, ob sich Dateien unterscheiden.quelle
diff -rq dir1 dir2 | grep 'Only in dir1/'
-q
Option: Auf den Manpages wird nur "Nur ausgeben, ob Dateien unterschiedlich sind" angezeigt, nicht wie überprüft wird, ob sie unterschiedlich sind. Ich habe den Quellcode durchgesehen und festgestellt, dass nur die Dateigrößen überprüft werden, um Unterschiede festzustellen, nicht der tatsächliche Inhalt.-q
Option kann ich nicht reproduzieren, dass nur die Dateigröße überprüft wird. Verwenden von GNU Diffutils 3.7 zum Vergleichen von zwei Dateien mit derselben Dateigröße, aber unterschiedlichem Inhalt mitdiff -q file1 file2
AusgabenFiles file1 and file2 differ
.Dieser Befehl gibt Ihnen Dateien, die sich in dir1 und nicht in dir2 befinden.
Über
<( )
sign können Sie es als "Prozessersetzung" googeln.quelle
(ls -R dir1|sort)
könnte es schaffen(ls -R dir|sort)
.vimdiff <(ls dir1 |sort) <(ls dir2|sort)
Ein guter Weg, um diesen Vergleich durchzuführen, ist die Verwendung
find
mitmd5sum
, dann adiff
.Beispiel:
Verwenden Sie
find
diese Option, um alle Dateien im Verzeichnis aufzulisten. Berechnen Sie dann den MD5-Hash für jede Datei und leiten Sie ihn an eine Datei weiter:Gehen Sie genauso in das andere Verzeichnis vor:
Vergleichen Sie dann die beiden Ergebnisdateien mit "diff":
Diese Strategie ist sehr nützlich, wenn sich die beiden zu vergleichenden Verzeichnisse nicht auf demselben Computer befinden und Sie sicherstellen müssen, dass die Dateien in beiden Verzeichnissen gleich sind.
Ein weiterer guter Weg, um die Arbeit zu erledigen, ist die Verwendung von Git
Freundliche Grüße!
quelle
Meld ( http://meldmerge.org/ ) leistet hervorragende Arbeit beim Vergleich von Verzeichnissen und den darin enthaltenen Dateien.
quelle
Das DirDiff- Plugin von vim ist ein weiteres sehr nützliches Tool zum Vergleichen von Verzeichnissen.
Es werden nicht nur die Dateien aufgelistet, die sich zwischen den Verzeichnissen unterscheiden, sondern Sie können auch die unterschiedlichen Dateien mit vimdiff überprüfen / ändern.
quelle
Unzufrieden mit allen Antworten, da die meisten sehr langsam arbeiten und unnötig lange Ausgaben für große Verzeichnisse erzeugen, habe ich mein eigenes Python-Skript geschrieben, um zwei Ordner zu vergleichen.
Im Gegensatz zu vielen anderen Lösungen werden die Inhalte der Dateien nicht verglichen. Es geht auch nicht in Unterverzeichnisse, die in einem anderen Verzeichnis fehlen. Die Ausgabe ist also sehr präzise und das Skript funktioniert schnell.
Beispielnutzung:
Oder wenn Sie nur Dateien aus dem ersten Verzeichnis sehen möchten:
PS Wenn Sie Dateigrößen und Datei-Hashes auf mögliche Änderungen vergleichen müssen, habe ich hier ein aktualisiertes Skript veröffentlicht: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
quelle
Ein anderer Ansatz (möglicherweise schneller für große Verzeichnisse):
Der
sed
Befehl entfernt die erste Verzeichniskomponente dank Erik`s Post )quelle
find
daher wird immer noch ein Kommentar und keine separate Antwort verwendet):cd dir2; find . -exec [ -e ../dir1/{} ] \; -o -print 2>/dev/null
Dadurch werden Dateien gedruckt, die in dir2, aber nicht in dir1 vorhanden sind.Dies ist etwas spät, kann aber jemandem helfen. Ich bin mir nicht sicher, ob diff oder rsync nur Dateinamen in einem bloßen Format wie diesem ausspucken. Vielen Dank an plhn für diese nette Lösung, die ich weiter unten erweitert habe.
Wenn Sie nur die Dateinamen verwenden möchten, damit Sie die benötigten Dateien einfach in ein sauberes Format kopieren können, können Sie den Befehl find verwenden.
Dies setzt voraus, dass sich sowohl dir1 als auch dir2 im selben übergeordneten Ordner befinden. sed entfernt nur den übergeordneten Ordner, damit Sie Äpfel mit Äpfeln vergleichen können. Das letzte Sed setzt nur den Namen dir1 zurück.
Wenn Sie nur Dateien möchten:
Ähnliches gilt für Verzeichnisse:
quelle
cd
vor demfind
ausführen können, anstatt sie verwenden zu müssensed
, zcomm -23 <(cd dir1 || exit; find -type f | sort) <(cd dir2 || exit; find -type f | sort)
. (Dieexit
s sind hier, um zu verhindern, dassfind
das aktuelle Verzeichnis verwendet wird, solltecd
fehlschlagen.)comm
mit Unterstützung haben-z
(mit git.savannah.gnu.org/cgit/coreutils.git/commit/… geliefert ), können Sie dies tuncomm -23 -z <(cd dir1 && find -type f -print0 | sort -z) <(cd dir2 && find -type f -print0 | sort -z)
. (In der Zwischenzeit habe ich auch herausgefunden, dass dasexit
s ersetzt werden könnte.)In der akzeptierten Antwort werden auch die Dateien aufgelistet, die in beiden Verzeichnissen vorhanden sind, jedoch unterschiedliche Inhalte haben. Um NUR die in dir1 vorhandenen Dateien aufzulisten, können Sie Folgendes verwenden:
Erläuterung:
quelle
Diese Antwort optimiert einen der Vorschläge von @ Adail-Junior durch Hinzufügen des
-D
Option. ist hilfreich, wenn keines der verglichenen Verzeichnisse Git-Repositorys sind:Wenn Sie verwenden
-D
, werden keine Vergleiche angezeigt mit/dev/null
:text Binary files a/whatever and /dev/null differ
quelle
Eine vereinfachte Methode zum Vergleichen von 2 Verzeichnissen mit dem Befehl DIFF
Öffnen Sie filename.dat, nachdem der Lauf abgeschlossen ist
und Sie werden sehen: Nur in Dateiname.1: Dateiname.2 Nur in: Verzeichnisname: Name_der_Datei1 Nur in: Verzeichnis_Name: Name_der_Datei2
quelle
Dies ist das Bash-Skript zum Drucken von Befehlen zum Synchronisieren von zwei Verzeichnissen
quelle
GNU
grep
kann die Suche mit der Option umkehren-v
. Dadurch werdengrep
die Zeilen gemeldet, die nicht übereinstimmen. Auf diese Weise können Sie die Dateien indir2
aus der Liste der Dateien in entfernendir1
.Die Optionen
-F -x
weisengrep
an, eine Zeichenfolgensuche für die gesamte Zeile durchzuführen.quelle