Ich habe mithilfe der folgenden Befehlszeile im Terminal einige Dateien aus dem Quellordner in den Zielordner kopiert.
sudo cp From_SOURCE/* To_DESTINATION/
Jetzt möchte ich diesen Befehl rückgängig machen.
Antwort1
Wenn ich es richtig verstehe, ist folgendes der Fall:
- Sie haben eine (vermutlich große) Anzahl von Dateien in ein bestehendes Verzeichnis kopiert und müssen/möchten den Vorgang rückgängig machen.
- Das Zielverzeichnis enthält eine Reihe vonandereDateien, die Sie dort aufbewahren müssen, was es unmöglich macht, sie einfach zu entfernenalleDateien aus dem Verzeichnis
Das folgende Skript sucht im ursprünglichen (Quell-)Verzeichnis und listet diese Dateien auf. Anschließend sucht es in dem Verzeichnis, in das Sie die Dateien kopiert haben, und entfernt nur die aufgelisteten Dateien, da sie im Quellverzeichnis vorhanden sind.
Das try
Element wird hinzugefügt, um Fehler zu vermeiden, beispielsweise wenn Sie einige Dateien bereits manuell entfernt haben oder 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
#!/usr/bin/env python
import os
source_dir = "/path/to/source" # the folder you copied the files from
target_folder = "/path/to/destination" # the folder you copied the files to
for root, dirs, files in os.walk(source_dir):
for name in files:
try:
os.remove(target_folder+"/"+name)
except FileNotFoundError:
pass
Wie benutzt man
- Fügen Sie das Skript in eine leere Datei ein, speichern Sie es unter
reverse.py
, - Geben Sie die korrekten Pfade für Quell- und Zielordner ein.
- Machen Sie es aus praktischen Gründen ausführbar,
Führen Sie es mit dem folgenden Befehl aus:
[sudo] /path/to/reverse.py
Warnung
Versuchen Sie zunächst in einem Testverzeichnis, ob ich richtig verstanden habe, was Sie erreichen möchten!
Wenn das Quellverzeichnis "flach" ist
Falls das Quellverzeichnis keine Unterverzeichnisse hat, kann das Skript sogar noch einfacher sein:
#!/usr/bin/env python
import os
source_dir = "/path/to/source" # the folder you copied the files from
target_folder = "/path/to/destination" # the folder you copied the files to
for file in os.listdir(source_dir):
try:
os.remove(target_folder+"/"+file)
except FileNotFoundError:
pass
Notiz
Wenn die Kopieraktionüberschrieben(ersetzt) eine ähnlich benannte Datei im Ziel, wird die Datei entfernt, aber die Originaldatei wird (natürlich) vom Skript nicht wiederhergestellt. Es wird davon ausgegangen, dass es keine Namenskonflikte gibt.
Antwort2
Kurz zusammengefasst:
Alle Dateien, die in beiden vorhanden sind src
, dest
können dest
wie folgt entfernt werden:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Eine schrittweise Erklärung finden Sie unten.
Vereinfachung des Problems:
Um zu verstehen, was der Befehl, den wir rückgängig machen möchten, tatsächlich bewirkt hat, vereinfachen wir ihn zunächst:
Der Befehl, den wir rückgängig machen möchten, ist
sudo cp From_SOURCE/* To_DESTINATION/
Für das Verständnis, wie man etwas rückgängig macht, sudo
ist dies nicht relevant.
Ich verwende die Verzeichnisnamen src
für From_SOURCE
und dest
für To_DESTINATION
.
Jetzt lautet unser Befehl:
cp src/* dest/
Wenn src
die Dateien f1
, f2
und f3
und die Verzeichnisse d1
und enthalten sind d2
, erweitert die Shell diesen Befehl wie folgt:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Ohne Optionen wie -r
, -R
oder kopiert -a
der Befehl keine Verzeichnisse. Das heißt, der Befehl lässt sie aus und zeigt für jedes Verzeichnis einen Fehler an:cp
$ 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 in dest
mit demselben Namen wie Dateien in src
. In diesem Fall wurden die Dateien überschrieben (1). Dafür ist es leider zu spät. Holen Sie sie aus dem letzten Backup zurück.
Von den vorhandenen Dateien möchten wir nur die kopierten Dateien entfernen. Diese Dateien sind in beiden Verzeichnissen mit demselben Namen und demselben Inhalt vorhanden.
Also suchen wir nach diesen Dateien:
Zuerst geben wir cd
in ein src
, weil es die folgenden find
Befehle viel einfacher macht, und setzen eine Variable auf den absoluten Pfad von dest:
$ cd src
$ destdir="$(readlink -f dest)"
Dann listen wir alle Dateien in src auf:
$ find . -maxdepth 1 -type f
und cmp
prüfen Sie für jede gefundene Datei, ob in dest eine Datei mit gleichem Inhalt vorhanden ist:
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -print
Entfernen Sie die Dateien vorsichtig:
Diese Dateien wollen wir entfernen. Um sicherzugehen, verschieben wir sie aber zunächst in ein anderes Verzeichnis – und schauen uns die Befehle an, 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 echo
die eigentlichen mv
Befehle weglassen:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Alle Dateien von , dest
die von kopiert wurden und in und src
eigentlich noch immer gleich sind , befinden sich nun in und können nach einem letzten Blick entfernt werden.src
dest
/tmp/toDelete/
Hinweise:
(1) Prüfen Sie, ob cp
es sich um einen Alias handelt cp -i
oder so, der durch vorherige Nachfrage das Überschreiben von Dateien verhindert hätte.
Antwort3
Das 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 die Ausgabe inrm
ls source | xargs rm
Antwort4
Dies ist eine Antwort basierend auf dem Zeitstempel des Kopiervorgangs. Sie können den Ordnerinhalt in der Reihenfolge der Erstellungszeit auflisten und in eine Datei weiterleiten:
ls -alt | file_list
Öffnen Sie dann file_list
die Dateien mit dem gleichen Zeitstempel der Kopiervorgänge und suchen Sie nach ihnen. Vermutlich handelt es sich dabei um die neuesten Dateien.
file_list
Bearbeiten Sie dann rm -rf
die nicht benötigten Dateien/Ordner und speichern Sie sie.
Dann mach:
source file_list