Befehlsaktion „Kopieren rückgängig machen“ (cp)

Befehlsaktion „Kopieren rückgängig machen“ (cp)

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 tryElement 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, destkönnen destwie 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, sudoist dies nicht relevant.

Ich verwende die Verzeichnisnamen srcfür From_SOURCEund destfür To_DESTINATION.

Jetzt lautet unser Befehl:

cp src/* dest/

Wenn srcdie Dateien f1, f2und f3und die Verzeichnisse d1und 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, -Roder kopiert -ader 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 destmit 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 cdin ein src, weil es die folgenden findBefehle 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 cmpprü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 echodie eigentlichen mvBefehle weglassen:

find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;

Alle Dateien von , destdie von kopiert wurden und in und srceigentlich noch immer gleich sind , befinden sich nun in und können nach einem letzten Blick entfernt werden.srcdest/tmp/toDelete/


Hinweise:
(1) Prüfen Sie, ob cpes sich um einen Alias ​​handelt cp -ioder 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 lsdas 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_listdie Dateien mit dem gleichen Zeitstempel der Kopiervorgänge und suchen Sie nach ihnen. Vermutlich handelt es sich dabei um die neuesten Dateien.

file_listBearbeiten Sie dann rm -rfdie nicht benötigten Dateien/Ordner und speichern Sie sie.

Dann mach:

source file_list

verwandte Informationen