Ich habe eine Datei vom Quellordner in den Zielordner kopiert, indem ich die folgende Befehlszeile im Terminal verwendet habe.
sudo cp From_SOURCE/* To_DESTINATION/
Jetzt möchte ich diesen Befehl rückgängig machen.
command-line
cp
αғsнιη
quelle
quelle
From_SOURCE/*
, und diese zu entfernenTo_DESTINATION/
. Dies könnte mit bash geschehen - die Probleme könnten darin bestehen, dass der Befehl cp alles überschreibt, Symlinks kopiert werden, Dateien mit Leerzeichen in Namen usw. -, also könnte es Probleme geben und etwas verrückt werden. Eine perfekte "Rückgängig" -Option könnte eine Menge Dinge berücksichtigen müssen.Antworten:
Wenn ich es richtig verstehe, ist Folgendes der Fall:
Das folgende Skript durchsucht das ursprüngliche (Quell-) Verzeichnis und listet diese Dateien auf. Dann wird in das Verzeichnis geschaut, in das Sie die Dateien kopiert haben, und es werden nur die aufgelisteten Dateien entfernt, die im Quellverzeichnis vorhanden sind.
Das
try
Element wird hinzugefügt, um Fehler zu vermeiden, zum Beispiel, wenn Sie einige Dateien bereits manuell entfernt haben oder wenn nicht alle Dateien aus dem Quellverzeichnis in das Ziel kopiert wurden. Wenn Sie sudo-Berechtigungen benötigen, führen Sie das Skript einfach mit "sudo" aus (siehe unten).Das Drehbuch
Wie benutzt man
reverse.py
,Führen Sie es mit folgendem Befehl aus:
Warnung
Probieren Sie zuerst ein Testverzeichnis aus, wenn ich verstanden habe, was Sie erreichen müssen!
Wenn das Quellverzeichnis "flach" ist
Falls das Quellverzeichnis keine Unterverzeichnisse enthält, kann das Skript noch einfacher sein:
Hinweis
Wenn die Kopieraktion eine Datei mit ähnlichem Namen im Ziel überschreibt (ersetzt), wird die Datei entfernt, aber die ursprüngliche Datei wird (natürlich) nicht vom Skript zurückgebracht. Die Annahme ist, dass es keine Namenskonflikte gibt.
quelle
sudo python3 reverse.py
. Ich akzeptiere deine Antwort.cp
.cp -r
. Ich änderteos.remove
mitprint
, und es wird eine Reihe von Dateien ausgibt, die nicht existieren. Ich gehe davon aus, dass die Unterverzeichnisse fehlen und nur die Dateien am Ende aufgelistet sind.TL; DR:
Alle Dateien, die in beiden vorhanden sind
src
unddest
wie folgt entfernt werdendest
können: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
Für das Verständnis, wie man rückgängig macht,
sudo
ist das nicht relevant.Ich werde die Verzeichnisnamen
src
fürFrom_SOURCE
unddest
für verwendenTo_DESTINATION
.Unser Befehl lautet nun:
Wenn
src
enthält die Dateienf1
,f2
undf3
, und die Verzeichnissed1
undd2
erweitert die Shell diesen Befehl zu:Ohne Optionen mögen
-r
,-R
oder-a
der Befehlcp
kopiert keine Verzeichnisse.Das heißt, der Befehl lässt sie weg und zeigt für jede von ihnen einen Fehler an:
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 insrc
. 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
insrc
, denn es macht die folgendenfind
Befehle wesentlich einfacher, und eine Variable auf den absoluten Pfad von dest gesetzt:Dann listen wir alle Dateien in src auf:
cmp
Überprüfen Sie für jede gefundene Datei, ob sich in dest eine Datei mit demselben Inhalt befindet: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:
Sieht gut aus! Jetzt können wir das weglassen,
echo
um die echtenmv
Befehle auszuführen:Alle Dateien, aus
dest
denen kopiertsrc
wurden und die immer noch insrc
und sinddest
, 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 handeltcp -i
, der das Überschreiben von Dateien verhindert hätte, indem Sie zuerst danach fragen.quelle
Dies ist alt, aber ich wollte nur eine reine Bash-Antwort posten:
Wechseln Sie zunächst in das Verzeichnis, in das Sie die Dateien kopiert haben.
cd dest
Dann
ls
das Quellverzeichnis und leiten Sie die Ausgabe inrm
ls source | xargs rm
quelle
ls
ist normalerweise eine schlechte Idee. mywiki.wooledge.org/ParsingLs Ich werde Ihren Beitrag nicht ablehnen, aber es muss beachtet werden.