Antworten:
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/passwd
z. 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 -r
das nicht gibt.
(Das macht nichts mv
bricht , dass die Philosophie in anderen, kleineren Möglichkeiten. Zum Beispiel mv
ist eigentlich ein , cp
gefolgt von , rm
wenn 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 mv
erzielen (zum Beispiel):
cp -al source/* dest/ && rm -r source/*
Das -l
Flag cp
bedeutet "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.
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 -n
Sie zuerst einen ausführlichen Probelauf mit dem aus , um sicherzustellen, dass er das tut, was Sie wollen.
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.