'mv' entspricht Drag & Drop mit Ersetzen?

19

In einer GUI-Umgebung werden durch Ziehen und Ablegen mit Ersetzen Dateien und ganze Verzeichnisse (einschließlich Inhalte) durch das ersetzt, was gerade kopiert wird. Gibt es eine Möglichkeit, dasselbe intuitive Ergebnis mit dem Befehl 'mv' zu erzielen?

user7089
quelle

Antworten:

20

Nicht bei mv.

Die Kernfunktion von mv(trotz seines Namens) besteht darin , ein Objekt umzubenennen . Eine der Garantien, die UNIX vorsieht, ist, dass Umbenennungen atomar sind - Sie dürfen niemals einen teilweise abgeschlossenen Umbenennungsvorgang sehen. Diese Garantie kann sehr nützlich sein, wenn Sie eine Datei ändern möchten ( /etc/passwdz. B.), auf die andere Programme möglicherweise zugreifen, und Sie möchten, dass sie entweder die alte oder die neue Version der Datei sehen, und keine andere Möglichkeit . Aber eine "rekursive Umbenennung", wie Sie sie beschreiben, würde diese Garantie brechen - Sie könnten sie in der Mitte stoppen und Sie hätten einen halbbewegten Baum und wahrscheinlich ein Durcheinander - und das passt nicht wirklich zur Philosophie von mv. Das ist meine Vermutung, warum es mv -rdas nicht gibt.

(Das macht nichts mvbricht , dass die Philosophie in anderen, kleineren Möglichkeiten. Zum Beispiel mvist eigentlich ein , cpgefolgt von , rmwenn Dateien von einem Dateisystem zum anderem.)

Genug der Philosophie. Wenn Sie einen Baum im selben Dateisystem rekursiv von einem Ort zum anderen verschieben ("ziehen") möchten , können Sie die folgende Effizienz und Geschwindigkeit mverzielen (zum Beispiel):

cp -al source/* dest/ && rm -r source/*

Das -lFlag cpbedeutet "Einen festen Link erstellen, anstatt zu kopieren" - es erstellt effektiv einen neuen Dateinamen, der auf dieselben Dateidaten verweist wie der alte Dateiname. Dies funktioniert jedoch nur auf Dateisystemen, die harte Links unterstützen. Daher ist jedes native UNIX-Dateisystem in Ordnung, funktioniert jedoch nicht mit FAT.

Das &&bedeutet "Führen Sie den folgenden Befehl nur aus, wenn der vorhergehende Befehl erfolgreich war". Wenn Sie möchten, können Sie stattdessen die beiden Befehle einzeln ausführen.

Jander
quelle
Sehr informativ. Vielen Dank!
user7089
4

Ich glaube nicht, dass Sie das von Ihnen beschriebene Drag-Drop-Verhalten replizieren können mv, da nicht leere Unterverzeichnisse im Ziel nicht ersetzt werden.

Vielleicht rsync? So etwas wie rsync -a -r source/ target/? Führen -v -nSie zuerst einen ausführlichen Probelauf mit dem aus , um sicherzustellen, dass er das tut, was Sie wollen.

cjc
quelle
3

mv -f /path/to/source/folder/* /destination/folder/

Verschiebt alles in / path / nach / source / folder, einschließlich der Dateien und Verzeichnisse nach / destination / folder.

Und überschreibt vorhandene Dateien und Verzeichnisse.

Tim
quelle
2
Nur leere Verzeichnisse
Kevin
1

Sie werden wahrscheinlich die richtige Antwort auf diese Frage ändern wollen:

https://github.com/iaindooley/pickdrop

Beispiel:

sage ich habe:

test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png

und ich möchte diese Dinge nach / site verschieben

so sieht es aus:

site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png

Ich kann gehen:

cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop

Dies ist buchstäblich Ausschneiden und Einfügen.

Prüfer
quelle
Sehr cool und definitiv einen Blick wert. Die Frage betraf jedoch speziell 'mv'. Ich denke, ich werde die richtige Antwort als diejenige belassen, die die Philosophie hinter mv im Detail erklärt. Vielen Dank für diesen Beitrag, auf jeden Fall sehr hilfreich.
user7089
Ebenfalls bemerkenswert aus der Readme-Datei: "Es ist überhaupt nicht robust - es speichert Ihre Auswahl in ~ / .pick, bis Sie drop aufrufen. Zu diesem Zeitpunkt werden die Dateipfade in ~ / .pick verwendet, um eine neue ausführbare ~ / .drop-Datei zu erstellen um jede ausgewählte Datei in das aktuelle Arbeitsverzeichnis zu kopieren. "
user7089