GNU/Linux >> Linux Esercitazione >  >> Linux

Unire le cartelle con Mv?

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 normale mv .
    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 di mv (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.

Correlati:come scaricare cartelle più grandi di 20 GB su Dropbox senza un account Pro?

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.


Linux
  1. Makefile con file sorgente in diverse directory

  2. non può generare lo script in una directory corrente

  3. Dovrei inserire una barra finale dopo l'origine e la destinazione quando copio le cartelle

  4. Directory di modifica dello script Shell con variabile

  5. Ottieni la dimensione di tutte le cartelle nella directory

Mappe mentali open source con Draw.io

Crea un SDN su Linux con open source

Comando sorgente Linux con esempi

Comando CD Linux con esempi

Come connettersi con Samba a Linux Active Directory

Problemi con l'unione degli account cPanel