GNU/Linux >> Linux Esercitazione >  >> Linux

Perché non riesco a gestire l'esistenza di una directory con lo stesso nome nella destinazione?

mv e rsync non sono programmi simili. In particolare, mv sta spesso tentando semplicemente di rinominare gli oggetti. Se si trova nello stesso filesystem, non copia affatto il contenuto.

Se non avevi già imperative_PLs/fortran , quindi mv prenderebbe il fortran esistente directory e rinominarla in quel punto dell'albero.

Ma hai già una directory (con contenuti) in quella posizione. Poiché un nome può fare riferimento solo a un singolo oggetto, la directory esistente dovrebbe essere rimossa o rinominata. mv presuppone che tu non voglia fare nessuna delle due cose e si interrompe.

rsync invece copia i singoli file e altri contenuti all'interno di fortran e li inserisce nel imperative_PLs/fortran esistente cartella.

Pensalo come rename invece, e il comportamento potrebbe sembrare più comprensibile.


mv in realtà è rename sotto il coperchio.

Se sposti un file in un altro file, mv presuppone che tu sappia cosa stai facendo e sovrascrive il file di destinazione.

Se sposti una directory in un'altra directory, mv presuppone che tu voglia mantenere il nome di base della tua directory originale e crearlo nella directory di destinazione. Se non esiste ancora una directory con quel nome sul lato di destinazione o se esiste una directory con quel nome ma è vuota, l'operazione ha esito positivo.

Tuttavia, se la directory di destinazione esiste già e non è vuota, non è più un rename ma dovrebbe essere una rimozione ricorsiva di file e directory. rename non è progettato per farlo quindi fallisce, mv non va oltre in quanto presuppone che tu non lo volessi fare e fallisce anch'esso.


  1. mv non funziona in questo caso perché non è stato progettato per farlo. Le chiamate di sistema sono (probabilmente) entrambe

    • Sposta nello stesso filesystem:rename (originariamente link e unlink )
    • Sposta tra i filesystem:copia di file ricorsiva seguita da unlink ricorsivo
  2. Opinione:Penso che non sia tanto che sia stato progettato non per funzionare, poiché non è stato progettato per gestire questo caso d'uso. Per uno strumento "semplice" destinato a fare bene una cosa, dovresti fornire una serie di opzioni da indicare a mv quale di questi percorsi di azione intraprendere:

    • Salvare con un errore, come nell'attuale implementazione
    • Per unire, eseguire il bailing con un errore se un file esiste già
    • Per unire, sostituendo qualsiasi file di destinazione già esistente

Se l'operazione di unione/sostituzione è ciò che desideri, puoi implementarla abbastanza facilmente con cp seguito da rm , oppure utilizzando una delle utilità di copia dell'albero dei file tar , pax , ecc.


Linux
  1. Perché Rm può rimuovere i file di sola lettura?

  2. File di gatto con directory?

  3. Unire le cartelle con Mv?

  4. Perché non posso usare Cd in uno script Bash??

  5. Usando –exclude con il comando Du?

Comando Rsync in Linux con esempi

Comando CD Linux con esempi

Perché il comando Ls è lento a interrompersi nella directory Nfs con molti file?

Perché posso accedere con password parziali??

Perché una cartella deve essere eseguibile?

ssh - perché posso accedere con password parziali?