Ich habe (nun ja , ich hatte ) ein Verzeichnis:
/media/admin/my_data
Es war ungefähr 49 GB groß und enthielt Zehntausende von Dateien. Das Verzeichnis ist der Mount-Punkt einer aktiven LUKS-Partition.
Ich wollte das Verzeichnis umbenennen in:
/media/admin/my_data_on_60GB_partition
Ich habe es damals noch nicht gemerkt, aber ich habe den Befehl vom Home-Verzeichnis aus ausgegeben, und am Ende habe ich Folgendes getan:
~% sudo mv /media/admin/my_data my_data_on_60GB_partition
Dann begann das mv
Programm, /media/admin/my_data
seine Inhalte in ein neues Verzeichnis zu verschieben ~/my_data_on_60GB_partition
.
Ich habe Ctrl+ verwendet C, um den Befehl vorzeitig abzubrechen, und habe jetzt eine ganze Reihe von Dateien, die auf Verzeichnisse verteilt sind:
~/my_data_on_60GB_partition <--- about 2GB worth files in here
und
/media/admin/my_data <---- about 47GB of orig files in here
Das neue Verzeichnis ~/my_data_on_60GB_partition
und einige seiner Unterverzeichnisse gehören root.
Ich gehe davon aus, dass das mv
Programm die Dateien zuerst als root kopiert und sie dann nach der Übertragung chown
wieder auf mein Benutzerkonto zurückgeschrieben hat.
Ich habe eine etwas alte Sicherung des Verzeichnisses / der Partition.
Meine Frage ist, ist es möglich, den Haufen von Dateien, die verschoben wurden, zuverlässig wiederherzustellen?
Das heißt, kann ich einfach laufen:
sudo mv ~/my_data_on_60GB_partition/* /media/admin/my_data
oder sollte ich den versuch der wiederherstellung aufgeben, da die dateien möglicherweise beschädigt und teilweise vollständig sind, etc.?
- OS - Ubuntu 16.04
mv --version
mv (GNU coreutils) 8.25
quelle
Control-Z
(zu pausieren) anstattControl-C
. In diesem Fall können Sie dann sehen, welche Datei zu diesem Zeitpunkt übertragen wurde, und wissen, welche Datei nur teilweise kopiert wurde. Sie können dann ruhig entscheiden, wie Sie vorgehen möchten. (Verwendungkill -stop
für Prozesse, die nicht im tty enthalten sind).(2GB + 47GB) < 60GB
. Die Partitionskapazität beträgt 60 GB, die Größe des Ordners und sein Inhalt: 49 GB.Antworten:
Beim Verschieben von Dateien zwischen Dateisystemen wird
mv
eine Datei nicht gelöscht, bevor der Kopiervorgang abgeschlossen ist, und die Dateien werden nacheinander verarbeitet (ich sagte anfangs, sie werden kopiert und dannmv
nacheinander gelöscht , aber das ist nicht garantiert - mindestens GNU- Kopien und dann werden alle Befehle gelöscht). Zeilenargument , und POSIX gibt dieses Verhalten an ). Sie sollten also höchstens eine unvollständige Datei im Zielverzeichnis haben, und das Original befindet sich weiterhin im Quellverzeichnis.Fügen Sie das
-i
Flag hinzu, damitmv
nichts überschrieben wird , um die Objekte zurückzusetzen:(vorausgesetzt, Sie haben keine versteckten Dateien zum Wiederherstellen
~/my_data_on_60GB_partition/
) oder noch besser (vorausgesetzt, Sie haben festgestellt, dass möglicherweise viele Dateien gelöscht werden müssen), fügen Sie das-n
Flag hinzu, damitmv
nichts überschrieben wird, aber nicht frag dich danach:Sie können auch die
-v
Flagge hinzufügen, um zu sehen, was gerade getan wird.Mit jedem POSIX-konform
mv
, nach wie vor die ursprüngliche Verzeichnisstruktur intakt sein sollte, so könnte alternativ Sie , dass der Check - und einfach löschen/media/admin/my_data
... (Im allgemeinen Fall aber ich denke , diemv -n
Variante der sichere Ansatz ist - es kümmert sich um alle Formen vonmv
, einschließlich zBmv /media/admin/my_data/* my_data_on_60GB_partition/
)Möglicherweise müssen Sie einige Berechtigungen wiederherstellen. Sie können dies massenweise mit
chown
und tunchmod
oder sie aus Backups mitgetfacl
und wiederherstellensetfacl
(danke an Sato Katsura für die Erinnerung ).quelle
find
, um Berechtigungen zu finden und festzulegen. Es gibt viele Dateien im neuen Verzeichnis, die Leerzeichen in den Dateinamen haben, aber keine versteckten Dateien - die ich kenne. Glauben Sie, dass der Globus im Befehlsudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/
den Dateinamen erweitern würde, ohne dass Probleme mit der Wortteilung auftreten? Ich dachte, ich könnte alternativ verwenden,sudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/
was ich glaube, würde die Dateipfade mit Leerzeichen behandeln?rsync
stattdessen , wenn Dinge wie OP beschrieben werden, um die Integrität aller Dateien zu überprüfen. Aber es ist schön zu wissen, dass ich das nicht brauche.su command mv -i ...
(odersu /bin/mv -i ...
) anstelle vonsudo mv -i ...
) für den Fall, dass ein (komischer) Administrator "mv" zu einer Funktion macht, die "mv -f" auf Systemebene ausführt (dh / etc / profile oder solche systemweiten Dateien). Befehl etwas: Starten Sie den Befehl etwas und nicht eine Funktion oder einen Alias mit demselben Namen. (zum Beispiel: man könnte (sehr!) Pech haben und eine (sehr, sehr schlechte!)function mv { /bin/mv -f -- "$@" }
Datei haben, die immer als Quelle dient, und dann wird "rm -i etwas" nichts fragen (und nur dagegen protestieren) -i "Datei existiert nicht!) ... [Ich habe solche Dinge gesehen ... zittern ]Nachdem Sie Stephen Kitts Antwort erhalten und diesen Befehl als mögliche Lösung erörtert haben:
Ich beschloss, es zu unterbrechen, bis mir klar wurde, was passierte. Diese Antwort beschreibt, was ich herausgefunden und am Ende getan habe.
Ich verwende Gnu,
mv
das Dateien auf das Ziel kopiert. Nur wenn der Kopiervorgang erfolgreich ist, wird das Original gelöscht.Ich wollte jedoch überprüfen, ob
mv
diese Sequenz Datei für Datei ausgeführt wird. Wenn dies zutrifft, wurde der ursprüngliche Ordnerinhalt sauber in zwei Teile aufgeteilt, wobei ein Teil an den Zielort verschoben wurde und der andere Teil noch an der Quelle zurückgelassen wurde. Und möglicherweise gibt es eine Datei, die während des Kopiervorgangs unterbrochen wurde, was für beide Verzeichnisse gleich wäre - und wahrscheinlich ist sie fehlerhaft.Um Dateien zu finden, die zwischen den beiden Verzeichnissen gemeinsam waren, habe ich Folgendes ausgeführt:
Dieses Ergebnis legt nahe, dass sowohl im Quell- als auch im Zielverzeichnis 14.237 Instanzen der gleichen Dateien vorhanden sind. Ich habe dies durch manuelles Überprüfen der Dateien bestätigt. Ja, in beiden Verzeichnissen befinden sich viele der gleichen Dateien. Dies legt nahe, dass nur nach dem
mv
Kopieren großer Datenmengen die Quelldateien gelöscht werden. Ein kurzer Blickinfo
auf dasmv
Kommando zeigteIch habe den Befehl nicht ausgeführt, aber ich vermute, dass ich versucht habe, ihn auszuführen
Die
-i
Eingabeaufforderung vor dem Überschreiben hätte wahrscheinlich mehr als 14.000 Mal ausgelöst.Um herauszufinden, wie viele Dateien sich insgesamt im neu erstellten Verzeichnis befinden, gehen Sie wie folgt vor:
Wenn sich also insgesamt 14238 reguläre Dateien im neuen Verzeichnis befanden und 14237 identische Originale in der Quelle hatten, bedeutet dies, dass sich nur eine Datei im neuen Verzeichnis befand, die keine entsprechende identische Datei in der Quelle hatte. Um herauszufinden, was diese Datei ist, habe ich rsync zurück in Richtung der Quelle ausgeführt:
Eine schnelle Überprüfung bestätigte, dass dies die fehlerhafte Datei war, bei der die Datei sowohl auf der Quelle als auch auf dem Ziel vorhanden war. Zieldatei = 64 MB, Original = 100 MB. Diese Datei und ihre Verzeichnishierarchie befanden sich noch im Besitz von root und hatten noch nicht die ursprünglichen Berechtigungen wiederhergestellt.
Also zusammenfassend:
mv
nie erreicht wurden, befinden sich (offensichtlich) noch an ihrem ursprünglichen Speicherort.mv
vollständig kopiert wurden, hatten noch ihre Originalkopien im QuellverzeichnisMit anderen Worten, alle Originaldateien waren noch intakt und die Lösung bestand in diesem Fall darin, einfach das neue Verzeichnis zu löschen!
quelle
-n
wäre im allgemeinen Fall besser. Ich habe denmv
Quellcode überprüft , er löscht das Quellargument nacheinander.mv
die Löschung auf der Quelle erfolgt. So ist der Befehlmv foo bar baz
bewegen würde ,foo
umbaz/foo
dann das Original löschtfoo
dann bewegenbar
zubaz/bar
..?cmp
eher verwenden alsdiff
vergleichen. Darüber hinaus ist Ihre obige Erläuterung nur dann sinnvoll, wenn Sie Dateien zwischen verschiedenen Dateisystemen verschieben. Es ist kein Kopieren erforderlich, wenn Dateien innerhalb desselben Dateisystems verschoben werden.Ich dachte nur, ich würde sagen, dass manche Leute versucht sein könnten, 'xargs' in die Mischung zu werfen, um die Dinge parallel laufen zu lassen. Das gibt mir die Qualen und ich mag die obige rsync-Lösung wirklich.
Beim Verschieben und Kopieren des Dateisystems und beim Löschen des Originals werden das VFS und die zugrunde liegenden Dateisysteme so koordiniert, dass die Atomarität pro Datei gewährleistet ist, bevor dieser Löschschritt ausgeführt wird. Selbst wenn es unterbrochen wird, bevor die Zieldatei vollständig geschrieben ist, ist die gesamte Sperre im VFS wirklich streng und schützt auch in parallelen Fällen vor Dingen wie zufälliger Datenverschachtelung. (Ich habe an Linux VFS und NFS4 Sachen gearbeitet)
Das Hinzufügen von 'xargs' zu der Mischung hätte den Schritt der doppelten Überprüfung der Vernunft wahrscheinlich zu Kopfschmerzen gemacht, da sich während der Übertragung mehrere Dateien befanden. Ich wünschte, ich hätte mehr Skripte auf Systemebene. Gute Erinnerungen für mich!
Liebte die Frage, gut für Spinnweben, und bringt mich dazu, Rsync wieder zu lieben. Prost!
quelle