¿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.
mvcon archivos, hace lo mismo, solo renombrando. Peromvcon directorios No es bueno eliminar todo el directorio con subdirectorio debido a unmvcomando que no es seguro. entonces se mueve comotest1/test2. pero si aún desea obtenerlo, escriba unaliasque verifique si el parámetro dado es directorio y luego haga rm -rf el directorio y use elmvcomando, pero úselo bajo su propio riesgo./helloy/hello2son directorios, entonces he notado quecp /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í.Respuestas:
mv a bintenta pasaraabsibes 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)aab.Para obtener un resultado consistente para mover un archivo a un directorio, puede hacer lo siguiente:
o
Si
dirno existe, obtendrá un error, y no va a cambiar el nombrefileadir.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:En ese caso,
fileno se moverá adestsidestes un directorio. Sin embargo, si ambosfileydestson directorios ydestestá vacía,filepasará a llamarse adest(y el originaldesteliminado). Si ambos son directorios ydestno está vacío,mv -Tse quejará.Igual, si
filey nodestson 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-TfiledestPara resumir, después
mv -T file dest,filehabrá cambiado el nombredesto 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.
-ves modo detallado.fuente