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:
rsyncpuò unire il contenuto di una directory in un'altra (idealmente con il--remove-source-filesopzione 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-ase lo desideri)
… ma questa è un'operazione di copia completa e può quindi richiedere molto disco.- Opzione attualmente preferita: Puoi combinare
rsync's--link-dest=DIRopzione (per creare collegamenti reali invece di copiare il contenuto dei file, ove possibile) e--remove-source-filesper ottenere una semantica molto simile a un normalemv.
Per questo,--link-destdeve essere fornito un percorso assoluto alla fonte directory (o un percorso relativo dalla destinazione alla fonte ).
… ma questo sta usando--link-destin 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
findper 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) cppuò 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.