'mv' equivalente di drag and drop con sostituzione?


19

In un ambiente con interfaccia grafica, un trascinamento con sostituzione sostituirà i file e intere directory (compresi i contenuti) con qualsiasi cosa venga copiata. C'è un modo per ottenere questo stesso risultato intuitivo con il comando 'mv'?

Risposte:


20

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/passwdad 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 -rnon esiste.

(Non importa che mvrompa quella filosofia in altri modi più piccoli. Ad esempio, mvfa effettivamente cpseguito da rmquando 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à mvcome segue (ad esempio):

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

Il -lflag cpsignifica "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.


Estremamente informativo. Grazie mille!
user7089

4

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 -nper eseguire prima un test a secco dettagliato per assicurarti che faccia quello che vuoi.


3

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

Sposterà tutto nella cartella / path / to / source /, inclusi i file e le directory nella cartella / destination /.

E sovrascriverà i file e le directory esistenti.


2
Solo directory vuote
Kevin,

1

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.


Molto bello, e sicuramente vale la pena esaminarlo. Tuttavia, la domanda riguardava in particolare "mv", quindi penso che lascerò la risposta corretta come quella che spiega in dettaglio la filosofia dietro mv. Grazie per questo contributo, sicuramente molto utile.
user7089

Notevole anche dal readme: "Non è affatto robusto: memorizza le tue scelte in ~ / .pick fino a quando non chiami drop in quel momento utilizza i percorsi dei file in ~ / .pick per creare un nuovo file eseguibile ~ / .drop per copiare ciascuno dei file che hai scelto nella directory di lavoro corrente. "
user7089,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.