TL; DR:
Alle Dateien, die in beiden vorhanden sind srcund destwie folgt entfernt werden destkönnen:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Eine schrittweise Erklärung finden Sie weiter unten.
Das Problem vereinfachen:
Um zu verstehen, was der Befehl, den wir rückgängig machen möchten, tatsächlich gemacht hat, vereinfachen wir ihn zunächst:
Der Befehl, den wir rückgängig machen möchten, lautet
sudo cp From_SOURCE/* To_DESTINATION/
Für das Verständnis, wie man rückgängig macht, sudoist das nicht relevant.
Ich werde die Verzeichnisnamen srcfür From_SOURCEund destfür verwenden To_DESTINATION.
Unser Befehl lautet nun:
cp src/* dest/
Wenn srcenthält die Dateien f1, f2und f3, und die Verzeichnisse d1und d2erweitert die Shell diesen Befehl zu:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Ohne Optionen mögen -r, -Roder -ader Befehl cpkopiert keine Verzeichnisse.
Das heißt, der Befehl lässt sie weg und zeigt für jede von ihnen einen Fehler an:
$ cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
cp: omitting directory 'src/d1'
cp: omitting directory 'src/d2'
Das heißt, wir haben nur einfache Dateien und keine Verzeichnisse nach kopiert dest.
Entscheiden, welche Dateien entfernt werden sollen:
Möglicherweise gab es Dateien destmit demselben Namen wie Dateien in src. In diesem Fall wurden die Dateien überschrieben (1). Es ist zu spät für sie, sorry. Holen Sie sie von der neuesten Sicherung zurück.
In Bezug auf die Dateien, die sich dort befinden, möchten wir nur Dateien entfernen, die kopiert wurden. Diese Dateien existieren in beiden Verzeichnissen mit demselben Namen und demselben Inhalt.
Also suchen wir nach diesen Dateien:
Erstens haben wir cdin src, denn es macht die folgenden findBefehle wesentlich einfacher, und eine Variable auf den absoluten Pfad von dest gesetzt:
$ cd src
$ destdir="$(readlink -f dest)"
Dann listen wir alle Dateien in src auf:
$ find . -maxdepth 1 -type f
cmpÜberprüfen Sie für jede gefundene Datei, ob sich in dest eine Datei mit demselben Inhalt befindet:
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -print
Entfernen Sie die Dateien sorgfältig:
Diese Dateien möchten wir entfernen. Aber um sicherzugehen, verschieben wir sie zuerst in ein anderes Verzeichnis - und werfen einen Blick auf die Befehle, bevor wir sie ausführen:
$ toDelete=/tmp/toDelete ; mkdir -p "$toDelete"
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec echo mv -n "$destdir/{}" "$toDelete"/ \;
mv -n /path/to/dest/./f1 /tmp/toDelete/`
mv -n /path/to/dest/./f2 /tmp/toDelete/`
mv -n /path/to/dest/./f3 /tmp/toDelete/`
Sieht gut aus! Jetzt können wir das weglassen, echoum die echten mvBefehle auszuführen:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Alle Dateien, aus destdenen kopiert srcwurden und die immer noch in srcund sind dest, befinden sich jetzt in /tmp/toDelete/und können nach einem letzten Blick entfernt werden.
Anmerkungen:
(1) Überprüfen Sie, ob cpes sich um einen Alias handelt cp -i, der das Überschreiben von Dateien verhindert hätte, indem Sie zuerst danach fragen.