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