Risposte:
Non con mv
.
La funzione principale di mv
(nonostante il suo nome) è quella di rinominare un oggetto. Una delle garanzie offerte da UNIX è che i nomi sono atomici: non ti è mai permesso vedere un nome parzialmente completato. Questa garanzia può essere molto utile se si desidera modificare un file ( /etc/passwd
ad esempio) che potrebbe essere visualizzato da altri programmi e si desidera che vedano la versione precedente o nuova del file e nessuna altra possibilità . Ma una "ridenominazione ricorsiva" come quella che descrivi romperebbe quella garanzia - potresti fermarla nel mezzo e avresti un albero mezzo mosso e probabilmente un disastro - e quindi non si adatta perfettamente alla filosofia di mv
. Questa è la mia ipotesi sul perché mv -r
non esiste.
(Non importa che mv
rompa quella filosofia in altri modi più piccoli. Ad esempio, mv
fa effettivamente cp
seguito da rm
quando si spostano i file da un filesystem a un altro.)
Basta filosofia. Se vuoi spostare ricorsivamente ("trascina e rilascia") un albero da un posto all'altro sullo stesso filesystem , puoi ottenere l'efficienza e la velocità mv
come segue (ad esempio):
cp -al source/* dest/ && rm -r source/*
Il -l
flag cp
significa "creare un collegamento reale invece di copiare" - sta effettivamente creando un nuovo nome file che punta agli stessi dati del file del vecchio nome file. Funziona solo su filesystem che supportano hard link, quindi qualsiasi file system nativo di UNIX va bene, ma non funziona con FAT.
Il &&
mezzo "esegue il comando seguente solo se il comando precedente ha avuto esito positivo". Se lo desideri, puoi invece eseguire i due comandi uno alla volta.
Non credo che tu possa replicare il comportamento di trascinamento della selezione che stai descrivendo mv
, poiché le sottodirectory non vuote nella destinazione non verranno sostituite.
Forse rsync
? Qualcosa del genere rsync -a -r source/ target/
? Esegui con il -v -n
per eseguire prima un test a secco dettagliato per assicurarti che faccia quello che vuoi.
Probabilmente vorrai cambiare la risposta corretta a questo:
https://github.com/iaindooley/pickdrop
Esempio:
dire che ho:
test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png
e voglio spostare queste cose su / site
quindi sembra che:
site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png
Posso andare:
cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop
Questo è letteralmente taglia e incolla.