Ist es besser, immer zu kopieren und zu löschen, als zu verschieben?


18

Im Allgemeinen gerate ich in Panik, wenn ich feststelle, dass das Ziel oder die Quelle unvollständig sein kann, wenn ich eine Datei verschiebe. Diese Frage gilt für Windows- und Unix-basierte Plattformen. Ich kann mich nie genau erinnern, wie der Befehl move in beiden Fällen funktioniert. Zum Beispiel, wenn Sie ein Verzeichnis verschieben; kopiert es das gesamte Verzeichnis und löscht es danach oder kopiert und löscht es jede Datei einzeln?

Mir ist nach dem Tippen immer klar, mv verybigdir destdass ich vielleicht hätte tippen sollen cp -R verybigdir dest  &&  rm -R verybigdir(wo der &&Operator nur dann zum nächsten Befehl übergeht, wenn der erste erfolgreich war) - oder ist das sinnlos? Was passiert genau, wenn ich Ctrl+ auf Chalber Strecke drücke ? Was genau passiert unter Windows, wenn ich die Abbrechen-Taste drücke?

Ich kann nicht zählen, wie oft ich etwas verschoben habe (das letzte Mal bei der Verwendung svn) und zwei Verzeichnisse mit geteiltem Inhalt hatte. Ich denke , die Antwort ist schwierig, weil nicht alle Anwendungen verschieben Gruppen von Dateien auf die gleiche Weise.


16
Was auch immer Sie tun, löschen Sie es einfach nicht zuerst.
mtone

@monotone Hilarious +1
Nick Bolton

Antworten:


10

Unter Windows verhält sich das Verschieben auf dasselbe Laufwerk und auf dieselbe Partition wie der Befehl mv von Unix und benennt den Ordner um oder ändert den übergeordneten Ordner. Wenn Sie es jedoch auf einen anderen Treiber oder eine andere Partition verschieben, wird es Datei für Datei kopiert und gelöscht. Daher ist es effizienter, eine TAR-Datei oder eine ZIP-Datei ohne Komprimierung zu verwenden, um Dateien schneller über Partitionen und Festplatten zu verschieben . Wenn Sie es stornieren würden, würde es einfach anhalten, wo es ist. Ich würde glauben, dass das Gleiche für Unix gilt, aber ich habe nicht genug damit experimentiert, um 100% sicher zu sein. Es geht nur darum, den Inode zu ändern. Befindet er sich jedoch auf einer anderen Partition oder einem anderen Laufwerk, muss er in Sektoren auf dieser Partition oder diesem Laufwerk kopiert werden. Wenn Sie es während der Übertragung abbrechen würden, hätte es bereits einige Dateien verschoben, und die Datei, die übertragen wurde, wird es sehen. '

Update: Wenn Sie einen Umzug abbrechen und ihn fortsetzen möchten, geben Sie einfach den Umzugsauftrag erneut aus. Möglicherweise werden Sie gewarnt, dass der Zielordner bereits vorhanden ist. Die Dateien werden jedoch nicht überschrieben (es sei denn, sie waren vor dem ursprünglichen Verschieben vorhanden oder wurden zwischen den beiden Verschiebungsaufträgen hinzugefügt), da sie beim Übertragen aus dem Ordner gelöscht werden Quelle (wenn auf einer anderen Partition oder einem anderen Laufwerk).


Ah, ich hatte nicht über Kompression nachgedacht.
Nick Bolton

Sie müssen nicht wirklich komprimieren, was viel Zeit in Anspruch nehmen kann. Manchmal reicht eine Komprimierungsstufe von 0 (Speicher) aus, um große Ordner viel schneller über Laufwerke zu verschieben.
Wolf

"Unter Windows verhält sich das Verschieben auf dasselbe Laufwerk und auf dieselbe Partition wie der Befehl mv von Unix und benennt den Ordner um oder ändert den übergeordneten Ordner." - Wenn Sie den Windows Explorer verwenden, stimmt das nicht. Es macht eine Menge Mist, es dauert Ewigkeiten, und Sie werden möglicherweise Inhalte in zwei Verzeichnissen finden. Sehen Sie sich diese Antwort auf eine Frage von mir an .
Maaartinus

@maaartinus Tatsächlich arbeitet Windows Explorer rekursiv in den Ordnern, anstatt den übergeordneten Knoten zu ändern. Sie haben Recht, aber für Windows Explorer ist es nicht nur ein atomarer Schachzug. Ich nahm an, dass die Befehlszeile verwendet wurde, ich hätte fragen sollen.
Wolf,

11

Selbst auf einem perfekt stabilen Computer, der niemals ausfällt: Wenn Sie sich für Zeitstempel interessieren, mvist das besser als normal cp.

( cp -abewahrt die Zeitstempel für Sie auf, und ich gehe davon aus, dass es unter Windows etwas Ähnliches gibt).


1
Aha, Zeitstempel. Das hatte ich nicht bedacht! +1
Nick Bolton

Sind Zeitstempel überhaupt wichtig, ehrlich gesagt ...
Marcin

1
@Marcin, sie sind aus einem bestimmten Grund da, wenn Sie danach fragen ...
macek

10

Nein.

Erläuterung:

mv verybigdir dest

benennt verybigdir in dest um. Dies ist eine atomare Operation, dh kann nicht auf halbem Weg durchfallen.

Wenn sich dest auf einem anderen Gerät befindet, kopiert mv zuerst und löscht dann die alte Version. Dies ist keine atomare Operation. Wenn dies fehlschlägt, haben Sie möglicherweise nur eine Teilkopie von verybigdir in dest, verybigdir ist jedoch noch vollständig.

Ja, andere Anwendungen verschieben Dateien möglicherweise anders.


2
Eigentlich denke ich, dass mv unter Linux jede Datei oder jedes Verzeichnis einzeln kopiert / löscht, anstatt den gesamten Baum zum Ziel zu kopieren und dann den gesamten Baum von der Quelle zu löschen Dateien an beiden Stellen, und keines der Verzeichnisse wird vollständig sein.
Rob

3
@rob: Nein. Verzeichnisse sind Dateien wie alle anderen und werden auf die gleiche Weise behandelt. Das Verhalten, von dem Sie sprechen, wird mit erreicht mv verybigdir/* dest.
dmckee

2
Grundsätzlich behandelt mv jedes Argument auf "cp && rm" Weise ... mv verybigdir/* destteilt das mv von verybigdir in viele separate Verschiebeoperationen auf. Denken Sie immer daran, dass ein Linux-Programm / -Tool im Gegensatz zu Windows nicht "*" erkennt, sondern um die Shell erweitert wird.
Jürgen A. Erhard

4

Unter Windows kopiere und lösche ich immer, anstatt zu verschieben. Ich habe einmal Dateien verschoben und hier habe ich zum ersten Mal einen schlechten Speicherstick bemerkt. Beim Verschieben der Datei wurde sie zwischenzeitlich angehalten und es wurde ein Fehler gemeldet. Ich überprüfte den Quellordner und die Datei war verschwunden. Dann überprüfte ich das Ziel und es gab eine beschädigte Datei. Dies war häufiger bei größeren Dateien der Fall. Bei den meisten handelte es sich um stundenlange Downloads. Daher empfehlen wir, diese zu kopieren und anschließend zu löschen. Sparen Sie sich am Anfang Zeit, die sich am Ende auszahlt.


3

Unter Unix werden bei Verschiebungen, die keine Dateisystemgrenzen überschreiten, mvdie Daten nicht kopiert: Es wird lediglich die Inode-Datenbank in verschiedenen Verzeichnissen aktualisiert. Dies ist viel schneller als cpbei großen Dateien.

Ferner wurde unter Verwendung mvruft über Dateisystem Grenzen nur leise eine Kopie und Löschmechanismus.

Also ich denke du solltest es vorziehen mv.


Schön zusammengefasst.
Nick Bolton

"Ein Kopier- und Löschmechanismus" könnte so interpretiert werden, dass entweder "jede Datei kopieren und dann löschen" oder "alle Dateien kopieren und dann alle löschen".
j_random_hacker

2

Zumindest in Windows ist move einfach ein automatisierteres Kopieren und Löschen. Ich glaube, mv verschiebt jede Datei einzeln, was bedeutet, dass c-ing keine Dateien verliert. Im Gegensatz zu Windows Explorer werden Ihre Dateien nur auf zwei Bereiche aufgeteilt.

Meine Lösung für dieses Problem lautet: Bewegen Sie sich nie, es sei denn, ich bin sicher, dass ich es verschieben möchte.


1

Wenn Sie ACLs für das Quellendateisystem, jedoch nicht für das Ziel verwenden, kopiert mv unter Linux die Quelle und stoppt dann - da die ACLs für das Ziel nicht festgelegt werden können. So haben Sie die Datei auf beiden Seiten. Das ist kein Schalter in mv, um dieses Verhalten zu verhindern, in diesem Fall ist cp & rm vorzuziehen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.