TL; DR:
Alle Dateien, die in beiden vorhanden sind src
und dest
wie folgt entfernt werden dest
kö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, sudo
ist das nicht relevant.
Ich werde die Verzeichnisnamen src
für From_SOURCE
und dest
für verwenden To_DESTINATION
.
Unser Befehl lautet nun:
cp src/* dest/
Wenn src
enthält die Dateien f1
, f2
und f3
, und die Verzeichnisse d1
und d2
erweitert die Shell diesen Befehl zu:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Ohne Optionen mögen -r
, -R
oder -a
der Befehl cp
kopiert 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 dest
mit 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 cd
in src
, denn es macht die folgenden find
Befehle 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, echo
um die echten mv
Befehle auszuführen:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Alle Dateien, aus dest
denen kopiert src
wurden und die immer noch in src
und sind dest
, befinden sich jetzt in /tmp/toDelete/
und können nach einem letzten Blick entfernt werden.
Anmerkungen:
(1) Überprüfen Sie, ob cp
es sich um einen Alias handelt cp -i
, der das Überschreiben von Dateien verhindert hätte, indem Sie zuerst danach fragen.