Kopieren von Diff-Ergebnisdateien

Kopieren von Diff-Ergebnisdateien

Ich habe zwei Ordner – Ordner A und Ordner B.

Ich habe die Dateien aus beiden Ordnern mit dem Befehl „diff“ verglichen. Nachdem ich nun festgestellt habe, dass bestimmte Dateien nur in Ordner A und bestimmte Dateien in Ordner B verfügbar sind, möchte ich diese unterschiedlichen Dateien aus beiden Ordnern in einen Ordner namens Ordner C kopieren, der nun alle eindeutigen Dateien aus A und B enthält

Wie kann ich das machen?

Antwort1

Du könntest benutzenArray-Subtraktions- und Klammernerweiterungsfunktionen von zsh, etwa so:

Aufstellen:

$ tree .
.
├── folderA
│   ├── file0
│   ├── file1
│   └── file2
├── folderB
│   ├── file2
│   ├── file3
│   └── file4
└── folderC

3 directories, 6 files


cd folderA
A=(*)
cd ../folderB
B=(*)
cd ..

Ausführung:

cp folderA/${^A:|B} folderB/${^B:|A} folderC

Ergebnis:

$ tree folderC
folderC
├── file0
├── file1
├── file3
└── file4

0 directories, 4 files

Die beiden Einrichtungsschritte erstellen Arrays (mit den Namen Aund B), die die Dateinamen in den Ordnern A bzw. B enthalten.

Der Ausführungsschritt fordert Sie auf, cpdie Erweiterung des AArrays minus des BArrays, alles mit dem Präfix , folderAsowie die entsprechende Erweiterung des BArrays minus des AArrays (alles mit dem Präfix folderB) in zu kopieren folderC.

Antwort2

Eine Hack-Lösung mit diff, sedund xargs:

Versuchsaufbau:

$ mkdir folderA folderB folderC
$ touch folderA/fi\ le1 folderA/file2 folderA/file3 folderB/file3 folderB/file4
$ diff -rq folderA folderB
Only in folderA: fi le1
Only in folderA: file2
Only in folderB: file4

Jetzt sedfiltern wir alle Zeilen, die mit einer Zeichenfolge beginnen Only in folderA:, und ändern diesen Teil in , folderA/um einen relativen Dateinamen mit Anführungszeichen () zu bilden 'folderA/fi le1'. Diese Zeichenfolge wird dann weitergeleitet xargsund zum Kopieren dieser Datei nach verwendet folderC.

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderA\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderA/fi le1' -> 'folderC/fi le1'
'folderA/file2' -> 'folderC/file2'

Dasselbe wie oben für folderB:

$ diff -rq folderA folderB | sed -n "s/^Only in \(folderB\): \(.*\)/'\1\/\2'/p" | xargs cp -vt folderC
'folderB/file4' -> 'folderC/file4'

verwandte Informationen