mv
es un comando de Unix que mueve uno o más archivos o directorios de un lugar a otro. Si ambos nombres de archivos están en el mismo sistema de archivos, esto resulta en un simple cambio de nombre de archivo; de lo contrario, el contenido del archivo se copia a la nueva ubicación y el archivo antiguo se elimina. El uso mv
requiere que el usuario tenga permiso de escritura para los directorios entre los que se moverá el archivo. Esto se debe a que mv
cambia el contenido de ambos directorios ( es decir , el de origen y el de destino) involucrados en el movimiento. Cuando se utiliza el mv
comando en archivos ubicados en el mismo sistema de archivos, la marca de tiempo del archivo no se actualiza.
En las implementaciones de UNIX derivadas de AT&T UNIX , cp , ln y mv se implementan como un único programa con binarios vinculados . El comportamiento se selecciona a partir del nombre de la ruta argv[0]
. Esta es una técnica común mediante la cual comandos estrechamente relacionados que se han empaquetado como una unidad permiten al usuario especificar el curso particular de la acción prevista.
Un move
comando que mueve una entrada de directorio a un nuevo directorio se implementó por primera vez en Multics . Se puede contratar a mv
. [1] Más tarde, el mv
comando apareció en la versión 1 de Unix [2] y pasó a formar parte de la edición 2 de X/Open Portability Guide de 1987. [3]
La versión mv
incluida en GNU coreutils fue escrita por Mike Parker, David MacKenzie y Jim Meyering. [4] El comando está disponible como un paquete separado para Microsoft Windows como parte de la colección UnxUtils de puertos nativos Win32 de utilidades comunes similares a GNU Unix. [5] El comando mv también ha sido portado al sistema operativo IBM i . [6]
Cuando un nombre de archivo se mueve a un nombre de archivo existente, el archivo existente se elimina ( golpea ) de forma predeterminada. Si el archivo existente no se puede escribir pero está en un directorio que sí se puede escribir, el comando mv solicita confirmación (si se ejecuta desde una terminal) antes de continuar, a menos que se use la opción -f (forzar).
Se puede evitar la sobrescritura accidental utilizando el indicador GNU -n
(formato largo --no-clobber
:). Alternativamente, -u
( --update
) solo sobrescribe los archivos de destino que son más antiguos que los archivos de origen, -i
( --interactive
) solicita confirmación ante cada conflicto de nombres y -b
( --backup
) cambia el nombre de los archivos de destino para eliminarlos.
Una ambigüedad relacionada surge cuando un nombre de archivo se mueve a un directorio existente. De forma predeterminada, mv
esto se manejaría como si se intentara mover un nombre dentro de este directorio. GNU mv tiene un -T
interruptor para deshabilitar esta suposición y, en su lugar, intenta sobrescribir el directorio. Una inversa -t
hace explícita la operación de mover al directorio. [4]
Mover archivos dentro del mismo sistema de archivos generalmente se implementa de manera diferente a copiar el archivo y luego eliminar el original. En plataformas que no admiten el cambio de nombre de syscall, se agrega un nuevo enlace al nuevo directorio y se elimina el original. No se accede a los datos del fichero. Todos los sistemas compatibles con POSIX implementan la llamada de cambio de nombre .
Un movimiento real (efectivamente, un cambio de nombre) es dramáticamente más rápido que el tortuoso procedimiento de copiar y mover. El número i del archivo (abreviatura de " número de inodo ") no cambia. No se requiere ningún permiso para leer el archivo que se está moviendo en la medida en que, conceptualmente hablando, lo que se cambia como resultado del "movimiento" es sólo información de catalogación . Dado que los directorios de origen y de destino se están modificando, es decir, las entradas se crean dentro del directorio de destino y se borran del directorio de origen, se requiere permiso de "escritura" en ambos directorios para completar el movimiento. Mover archivos de un sistema de archivos a otro puede fallar por completo o puede realizarse automáticamente como una acción atómica de copiar y eliminar; los detalles reales dependen de la implementación.
Mover un directorio de un padre a otro directorio padre diferente requiere permiso de escritura en el directorio que se está moviendo, además de permisos para modificar los padres nuevos y antiguos. Esto se debe a que el número i de la entrada del directorio ".." (que puede usarse en cualquier contexto como alias para el directorio principal del directorio actual) cambia como resultado del cambio de nombre.
La mayoría de las versiones de mv admiten:
-i
Procese de forma interactiva, escriba un mensaje de error estándar antes de mover un archivo que sobrescribiría un archivo existente. Si la respuesta de la entrada estándar comienza con el carácter 'y' o 'Y', se intenta el movimiento. (Anula la opción -f anterior).-f
Fuerce la sobrescritura del destino (anula la opción -i anterior).Estas opciones son parte de X/Open Portability Pautas, más tarde la base de POSIX y SUS . Todas las implementaciones de mv compatibles con POSIX deben admitirlos. [7]
Tenga en cuenta que, en el ejemplo anterior, /mnt se refiere al directorio (el "punto de montaje") sobre el que está montado un sistema de archivos determinado. Nombrar estos directorios /mnt es una convención popular, pero de ninguna manera es necesario. Un "sistema de archivos" puede considerarse como un árbol independiente que lógicamente se considera una unidad; su raíz está "montada" encima de un directorio elegido por el administrador. Cualquier contenido anterior de ese directorio es invisible, pero se "restaura" cuando se desmonta el nuevo volumen.