Se uso mv
per spostare una cartella denominata "cartella" in una directory che contiene già "cartella" si uniranno o verrà sostituita?
Risposta accettata:
mv
non può unire o sovrascrivere directory, fallirà con il messaggio "mv:impossibile spostare 'a' in 'b':Directory not empty" , anche quando utilizzi --force
opzione.
Puoi aggirare il problema utilizzando altri strumenti (come rsync
, find
o anche cp
), ma è necessario considerare attentamente le implicazioni:
rsync
può unire il contenuto di una directory in un'altra (idealmente con il--remove-source-files
opzione per eliminare in modo sicuro solo i file di origine che sono stati trasferiti correttamente e con la consueta opzione di autorizzazione/proprietà/conservazione del tempo-a
se lo desideri)
… ma questa è un'operazione di copia completa e può quindi richiedere molto disco.- Opzione attualmente preferita: Puoi combinare
rsync
's--link-dest=DIR
opzione (per creare collegamenti reali invece di copiare il contenuto dei file, ove possibile) e--remove-source-files
per ottenere una semantica molto simile a un normalemv
.
Per questo,--link-dest
deve essere fornito un percorso assoluto alla fonte directory (o un percorso relativo dalla destinazione alla fonte ).
… ma questo sta usando--link-dest
in modo non intenzionale (che può o meno causare complicazioni), richiede la conoscenza (o la determinazione) del percorso assoluto alla fonte (come argomento per--link-dest
), e di nuovo lascia una struttura di directory vuota da ripulire come per . - Puoi usare
find
per ricreare in sequenza la struttura della directory di origine nella destinazione, quindi spostare individualmente i file effettivi
… ma questo deve ricorrere più volte all'origine e può incontrare condizioni di gara (nuove directory create all'origine durante il processo a più fasi) cp
può creare collegamenti reali (in poche parole, puntatori aggiuntivi allo stesso file esistente), che crea un risultato molto simile a una fusione dimv
(ed è molto efficiente in termini di IO poiché vengono creati solo i puntatori e non è necessario copiare i dati effettivi)
… ma anche questo soffre di una possibile race condition (i nuovi file alla fonte vengono eliminati anche se non sono stati copiati nel passaggio precedente)
Quale di queste soluzioni alternative (se presenti) è appropriata dipenderà molto dal tuo caso d'uso specifico.
Come sempre, pensa prima di eseguire uno qualsiasi di questi comandi e fai dei backup.
1:Nota che rsync --remove-source-files
non cancellerà nessuna directory, quindi dovrai fare qualcosa come find -depth -type d -empty -delete
in seguito per eliminare l'albero di directory di origine vuoto.