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.
-
mvnon funziona in questo caso perché non è stato progettato per farlo. Le chiamate di sistema sono (probabilmente) entrambe- Sposta nello stesso filesystem:
rename(originariamentelinkeunlink) - Sposta tra i filesystem:copia di file ricorsiva seguita da
unlinkricorsivo
- Sposta nello stesso filesystem:
-
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
mvquale 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.