¿Cómo decidir que mv se mueve a un directorio en lugar de reemplazar el directorio?

18

Digamos que tengo un directorio /hello.

Entonces lo hago mv /hello /hello2.

Estoy moviendo /helloen /hello2/hello? O estoy moviendo /helloa /hello2?

Parece que cuando hago algo como esto, obtengo resultados inconsistentes.

user4951
fuente
1
¿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.

Stéphane Chazelas
fuente
14

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'.

Don simon
fuente
3

Probé estos

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'

Espero que esto lo explique todo. -ves modo detallado.

harish.venkat
fuente