¿En qué caso el resultado es inconsistente? Parece que cada vez que existe el directorio de destino se mueve al directorio de destino, de lo contrario se renombra.
jmathew
Eso es inconsistente. El mismo comando debería hacer lo mismo. Eso significa que el comando es ambiguo.
user4951
Eso no es realmente inconsistente porque actúa de manera consistente dentro del contexto. Aunque puedo ver cómo es confuso, pero cuanto más lo pienso, el comando tiene que ser así para que funcione en todos los escenarios.
jmathew
Prefiero decir que así es como está diseñado y también es lógico ... si lo usa mvcon archivos, hace lo mismo, solo renombrando. Pero mvcon directorios No es bueno eliminar todo el directorio con subdirectorio debido a un mvcomando que no es seguro. entonces se mueve como test1/test2. pero si aún desea obtenerlo, escriba un aliasque verifique si el parámetro dado es directorio y luego haga rm -rf el directorio y use el mvcomando, pero úselo bajo su propio riesgo.
harish.venkat
Sospecho que su ejemplo se basa en recordar mal algo que sucedió en el pasado, basado en "Parece que hago algo como esto". Si ambos /helloy /hello2son directorios, entonces he notado que cp /hello /hello2es el que es inconsistente. Dependiendo de qué combinación de barras diagonales hay, a veces /hellose copia el contenido de /hello2, y a veces se copia el directorio en sí.
Izkata
Respuestas:
16
mv a bintenta pasar aa bsi bes un directorio o un enlace simbólico a un directorio. De lo contrario, cambiará el nombre (o copiará y eliminará si está en diferentes sistemas de archivos) aa b.
Para obtener un resultado consistente para mover un archivo a un directorio, puede hacer lo siguiente:
mv file dir/
o
mv file dir/.
Si dirno existe, obtendrá un error, y no va a cambiar el nombre filea dir.
Si, por otro lado, desea hacer un renamesin tener que preocuparse si el archivo de destino existe como un directorio o no, con GNU mv, puede hacer:
mv -T file dest
En ese caso, fileno se moverá a destsi destes un directorio. Sin embargo, si ambos filey destson directorios y destestá vacía, filepasará a llamarse a dest(y el original desteliminado). Si ambos son directorios y destno está vacío, mv -Tse quejará.
Igual, si filey nodest son directorios (y eso incluye enlaces simbólicos, incluidos enlaces simbólicos a directorios), se les cambiará el nombre (aunque recibirá un mensaje si no tiene permiso de escritura ), y se eliminará el original . Hay una diferencia con el caso donde es un enlace simbólico a un directorio. Con , se renombra a , pero sin , se mueve al directorio al que apunta .filedestdestdestmv file destdest-Tfiledest-Tfiledest
Para resumir, después mv -T file dest, filehabrá cambiado el nombre desto recibirá un mensaje de error (o un mensaje). Si el comando tuvo éxito, el original dest, si existía de antemano, se habrá eliminado.
mv
con archivos, hace lo mismo, solo renombrando. Peromv
con directorios No es bueno eliminar todo el directorio con subdirectorio debido a unmv
comando que no es seguro. entonces se mueve comotest1/test2
. pero si aún desea obtenerlo, escriba unalias
que verifique si el parámetro dado es directorio y luego haga rm -rf el directorio y use elmv
comando, pero úselo bajo su propio riesgo./hello
y/hello2
son directorios, entonces he notado quecp /hello /hello2
es el que es inconsistente. Dependiendo de qué combinación de barras diagonales hay, a veces/hello
se copia el contenido de/hello2
, y a veces se copia el directorio en sí.Respuestas:
mv a b
intenta pasara
ab
sib
es un directorio o un enlace simbólico a un directorio. De lo contrario, cambiará el nombre (o copiará y eliminará si está en diferentes sistemas de archivos)a
ab
.Para obtener un resultado consistente para mover un archivo a un directorio, puede hacer lo siguiente:
o
Si
dir
no existe, obtendrá un error, y no va a cambiar el nombrefile
adir
.Si, por otro lado, desea hacer un
rename
sin tener que preocuparse si el archivo de destino existe como un directorio o no, con GNU mv, puede hacer:En ese caso,
file
no se moverá adest
sidest
es un directorio. Sin embargo, si ambosfile
ydest
son directorios ydest
está vacía,file
pasará a llamarse adest
(y el originaldest
eliminado). Si ambos son directorios ydest
no está vacío,mv -T
se quejará.Igual, si
file
y nodest
son directorios (y eso incluye enlaces simbólicos, incluidos enlaces simbólicos a directorios), se les cambiará el nombre (aunque recibirá un mensaje si no tiene permiso de escritura ), y se eliminará el original . Hay una diferencia con el caso donde es un enlace simbólico a un directorio. Con , se renombra a , pero sin , se mueve al directorio al que apunta .file
dest
dest
dest
mv file dest
dest
-T
file
dest
-T
file
dest
Para resumir, después
mv -T file dest
,file
habrá cambiado el nombredest
o recibirá un mensaje de error (o un mensaje). Si el comando tuvo éxito, el originaldest
, si existía de antemano, se habrá eliminado.fuente
Esto depende completamente de si ya existía o no un directorio llamado '/ hello2'.
Si / hello2 existe Y es un directorio, entonces move siempre moverá / hello a / hello / hello2
Si / hello2 no existe, entonces mover siempre cambiará el nombre de / hello a / hello2
Si / hello2 existe Y es un archivo, obtendrá un error, "no se puede sobrescribir el directorio 'hello2' con el directorio 'hello'.
fuente
Probé estos
Espero que esto lo explique todo.
-v
es modo detallado.fuente