Come decidere che mv si sposta in una directory anziché sostituirla?


18

Di 'che ho una directory /hello.

Quindi lo faccio mv /hello /hello2.

Sto muovendo /helloin /hello2/hello? O mi sto trasferendo /helloa /hello2?

Sembra che quando faccio qualcosa del genere, ottengo risultati incoerenti.


1
In quale caso il risultato è incoerente? Sembra che ogni volta che esiste la directory di destinazione si sposta nella directory di destinazione, altrimenti viene rinominata.
jmathew,

Questo è incoerente. Lo stesso comando dovrebbe fare la stessa cosa. Ciò significa che il comando è ambiguo.
user4951

Questo non è davvero incoerente perché agisce in modo coerente nel contesto. Anche se riesco a vedere come sia confuso, ma più ci penso, il comando deve essere così per funzionare in tutti gli scenari.
jmathew,

Preferirei dire che è così che è progettato ed è anche logico ... se lo usi mvcon i file fa la stessa cosa. Basta rinominare. Ma mvcon le directory Non è bene eliminare l'intera directory con la sottodirectory a causa di un mvcomando che non è sicuro. quindi viene spostato come test1/test2. ma se vuoi ancora raggiungerlo scrivi un aliasche controlla se il parametro dato è directory e quindi fai rm -rf la directory e usa il mvcomando ma usalo a tuo rischio.
harish.venkat,

Ho il sospetto che il tuo esempio si basi sul ricordare male qualcosa che è successo in passato, sulla base di "Sembra che io faccia qualcosa del genere". Se entrambi /helloe /hello2sono directory, allora ho notato che cp /hello /hello2è quello che è incoerente. A seconda della combinazione di barre finali, a volte il contenuto di /helloviene copiato /hello2e talvolta la directory stessa viene copiata.
Izkata

Risposte:


16

mv a btenta di spostarsi ain bif bè una directory o un collegamento simbolico a una directory. In caso contrario, verrà rinominato (o copiato ed eliminato se su file system diversi) ain b.

Per ottenere un risultato coerente per spostare un file in una directory, puoi fare:

mv file dir/

o

mv file dir/.

Se dirnon esiste, si otterrà un errore, e non rinominerà filea dir.

Se invece vuoi fare una cosa renamesenza preoccuparti se il file di destinazione esiste o no come directory, con GNU mv puoi fare:

mv -T file dest

In tal caso, filenon verrà spostato in destse destè una directory. Tuttavia, se entrambi filee destsono directory ed destè vuoto, fileverrà rinominato in dest(e l'originale destrimosso). Se entrambe sono directory e destnon sono vuote, mv -Tsi lamenterà.

Allo stesso modo, se filee nondest sono directory (e che include collegamenti simbolici inclusi collegamenti simbolici alle directory), verrà rinominata (anche se verrà visualizzato un messaggio se non si dispone dell'autorizzazione in scrittura ) e l'originale verrà rimosso. C'è una differenza con nel caso in cui sia un collegamento simbolico a una directory. Con , viene rinominato in , ma senza , viene spostato nella directory indicata da .filedestdestdestmv file destdest-Tfiledest-Tfiledest

Quindi per riassumere, dopo mv -T file dest, o filesarà stato rinominato desto riceverai un messaggio di errore (o un prompt). Se il comando ha avuto esito positivo, l'originale dest, se esisteva in precedenza, sarebbe stato rimosso.


14

Ciò dipende interamente dal fatto che esistesse o meno una directory denominata "/ hello2".

Se / hello2 esiste E è una directory, allora sposta si sposterà / hello in / hello / hello2

Se / hello2 non esiste, allora sposta rinominerà sempre / hello in / hello2

Se / hello2 esiste E è un file, verrà visualizzato un errore "Impossibile sovrascrivere la non directory" hello2 "con la directory" hello ".


3

Ho provato questi

mkdir test1
mv -v test1 test2
output:`test1' -> `test2'
mkdir test1
mv -v test2 test1
output: `test2' -> `test1/test2'
touch test2
output:mv: cannot overwrite non-directory `test2' with directory `test1'

spero che questo spieghi tutto. -vè la modalità dettagliata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.