15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar
02.01.2024

El comando `mv` de Linux: Referencia técnica completa y guía de uso avanzado

El comando mv en Linux mueve o renombra archivos y directorios actualizando los metadatos del sistema de archivos — específicamente la entrada de directorio — sin copiar datos cuando opera dentro del mismo sistema de archivos. Esto lo convierte en una operación atómica y casi instantánea para movimientos dentro de la misma partición, independientemente del tamaño del archivo.

Comprender esta distinción separa a los usuarios ocasionales de los administradores que pueden diagnosticar por qué un movimiento entre dos puntos de montaje se comporta de manera diferente a uno dentro de una sola partición, por qué ciertas operaciones mv generan I/O de disco mientras otras no, y cómo usar el comando de forma segura en entornos de producción donde la integridad de los datos no es negociable.

Lo que el comando mv realmente hace internamente

Cuando ejecutas mv source destination en el mismo sistema de archivos, el kernel llama a rename(2) — una única llamada al sistema que reasigna atómicamente la entrada de directorio. No se leen ni escriben datos en el disco. El número de inodo permanece idéntico; solo cambia la ruta.

Cuando el origen y el destino residen en sistemas de archivos diferentes (particiones distintas, montajes NFS o bind mounts), mv recurre a una secuencia de copia-y-eliminación: lee los datos de origen, los escribe en el destino y desvincula el origen solo después de una escritura exitosa. Esto tiene implicaciones críticas:

  • Los movimientos entre sistemas de archivos interrumpidos pueden dejar una copia parcial en el destino y el original intacto en el origen, o — en los peores casos — eliminar el origen antes de que la escritura se complete.
  • Los movimientos de archivos grandes entre sistemas de archivos consumen ancho de banda de I/O y tiempo proporcional al tamaño del archivo.
  • Los permisos y la propiedad pueden no transferirse correctamente si el sistema de archivos de destino no admite el mismo modelo de permisos (p. ej., FAT32, algunos recursos compartidos de red).

Esta diferencia de comportamiento es invisible desde la sintaxis del comando, pero es fundamental para las decisiones de administración de sistemas en servidores que ejecutan VPS Hosting o Servidores Dedicados con múltiples puntos de montaje.

Sintaxis y opciones principales

mv [OPTIONS] SOURCE DESTINATION
mv [OPTIONS] SOURCE... DIRECTORY

Argumentos:

    SOURCE — Uno o más archivos o directorios a mover o renombrar.
    DESTINATION — La ruta de destino. Si es un directorio existente, el origen se coloca dentro de él. Si es una ruta inexistente, el origen se renombra a esa ruta.
    
    Referencia completa de opciones
    
    Opción
    Forma larga
    Comportamiento
    
    
    -i
    --interactive
    Solicita confirmación antes de sobrescribir un archivo existente
    
    
    -f
    --force
    Suprime todas las confirmaciones; sobrescribe sin confirmación
    
    
    -n
    --no-clobber
    Nunca sobrescribe un archivo existente; lo omite silenciosamente
    
    
    -u
    --update
    Mueve solo cuando el origen es más reciente que el destino o el destino no existe
    
    
    -v
    --verbose
    Imprime el nombre de cada archivo mientras se procesa
    
    
    -b
    --backup
    Crea una copia de seguridad de cada archivo que sería sobrescrito
    
    
    --suffix=SUFFIX
    --suffix
    Define el sufijo de la copia de seguridad (el predeterminado es ~)
    
    
    --strip-trailing-slashes
    —
    Elimina las barras finales de los argumentos de origen
    
    
    -t DIR
    --target-directory
    Mueve todos los orígenes al directorio especificado
    
    
    -T
    --no-target-directory
    Trata el destino como un archivo normal, no como un directorio
    
    
    Nota: El indicador -r / -R mencionado en muchos tutoriales no existe en GNU mv. A diferencia de cp, el comando mv mueve directorios de forma recursiva por defecto porque opera sobre entradas de directorio, no sobre contenidos de archivos. Pasar -r a mv en la mayoría de las distribuciones Linux producirá un error o será ignorado silenciosamente según la implementación.
    Operaciones básicas con ejemplos precisos
    Mover un archivo a un directorio diferente
    mv /home/user/report.txt /var/backups/
    El archivo report.txt se traslada a /var/backups/. Si /var/backups/ está en el mismo sistema de archivos que /home/user/, esto es instantáneo. Si no, los datos se copian físicamente.
    Renombrar un archivo en su lugar
    mv old_config.conf new_config.conf
    Ambas rutas comparten el mismo directorio padre, por lo que esta es una llamada pura a rename(2) — sin movimiento de datos, sin I/O.
    Mover múltiples archivos a un directorio
    mv file1.txt file2.txt file3.txt /var/www/html/assets/
    Cuando se especifican múltiples orígenes, el destino debe ser un directorio existente. Si no existe, mv devolverá un error.
    Mover un directorio
    mv /home/user/project /opt/projects/
    Todo el árbol de directorios — incluyendo todos los archivos anidados y subdirectorios — se mueve como una única operación atómica en el mismo sistema de archivos. No se requiere ni se acepta ningún indicador -r.
    Patrones de uso avanzado
    Usar --backup para prevenir pérdida accidental de datos
    La opción --backup es uno de los mecanismos de seguridad más infrautilizados en mv. Crea una copia de seguridad versionada de cualquier archivo que sería sobrescrito:
    mv --backup=numbered config.yml /etc/app/config.yml
    Esto produce /etc/app/config.yml.~1~, .~2~, y así sucesivamente para sobrescrituras sucesivas. En scripts de despliegue automatizados, este patrón proporciona un mecanismo de reversión ligero sin una herramienta de copia de seguridad dedicada.
    Modos de control de copias de seguridad:
    
    none / off — Sin copia de seguridad (comportamiento predeterminado sin --backup)
    simple / never — Siempre crea una copia de seguridad simple con el sufijo ~
  • numbered / t — Crea copias de seguridad numeradas (.~1~, .~2~, …)
  • existing / nil — Usa copias de seguridad numeradas si ya existen; de lo contrario, simples

Movimientos condicionales con --update

mv --update /tmp/processed/*.csv /data/archive/

Solo los archivos en /tmp/processed/ que sean más recientes que sus equivalentes en /data/archive/ serán movidos. Los archivos con marcas de tiempo idénticas o más antiguas se dejan intactos. Esto es especialmente útil en pipelines ETL y scripts de rotación de logs donde la idempotencia es importante.

Usar -t para sintaxis compatible con scripts

La opción --target-directory invierte el orden de los argumentos, haciéndola compatible con pipelines de xargs y find:

find /var/log -name "*.log.gz" -mtime +30 | xargs mv -t /mnt/cold-storage/logs/

Sin -t, xargs necesitaría construir la lista de argumentos de manera diferente. Este patrón es mucho más confiable en la automatización de producción.

Combinar --no-clobber con salida detallada

mv -nv *.conf /etc/app/conf.d/

Esto mueve todos los archivos .conf sin sobrescribir ninguno existente, e imprime cada movimiento exitoso en stdout. La combinación es ideal para operaciones masivas seguras y auditables.

Mover archivos entre sistemas de archivos de forma segura

Al mover archivos o directorios grandes entre puntos de montaje, considera este patrón para garantizar la integridad:

rsync -a --remove-source-files /source/path/ /destination/path/ && 
find /source/path -type d -empty -delete

rsync con --remove-source-files realiza una copia verificada con validación de suma de comprobación y posterior eliminación, lo que mv no proporciona para operaciones entre sistemas de archivos. Usa este enfoque para migraciones de datos críticos en servidores de producción.

Casos de uso prácticos en administración de sistemas

Rotación de logs de aplicaciones

mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%Y%m%d)
kill -USR1 $(cat /var/run/nginx.pid)

Esto renombra el archivo de log activo y señala a Nginx que reabra su descriptor de archivo de log. La combinación es la base de la rotación manual de logs antes de que logrotate lo gestione automáticamente.

Despliegue atómico de archivos de configuración

mv --backup=numbered /tmp/nginx.conf /etc/nginx/nginx.conf
nginx -t && systemctl reload nginx

La copia de seguridad garantiza que la configuración anterior se preserve si la nueva falla en la validación.

Organización de activos del servidor web

En un servidor que ejecuta una aplicación web, organización masiva de archivos subidos por tipo:

mv /var/www/uploads/*.jpg /var/www/uploads/images/
mv /var/www/uploads/*.pdf /var/www/uploads/documents/
mv /var/www/uploads/*.mp4 /var/www/uploads/video/

Este tipo de gestión estructurada de activos es común en servidores que alojan sitios a través de Hosting Web Compartido o entornos VPS con cPanel administrados.

Preparación de renovaciones de certificados SSL

Al gestionar certificados renovados manualmente, mv con copia de seguridad es un patrón de despliegue seguro:

mv --backup=simple /etc/ssl/certs/domain.crt /etc/ssl/certs/domain.crt.bak
mv /tmp/new_domain.crt /etc/ssl/certs/domain.crt

Para la gestión automatizada de certificados, combinar esto con un servicio de Certificados SSL correctamente configurado elimina por completo la necesidad de rotación manual.

Archivado de datos de correo electrónico en un servidor de correo

En un servidor que ejecuta servicios de correo, moviendo buzones procesados a almacenamiento en frío:

mv --update /var/mail/processed/ /mnt/archive/mail/$(date +%Y-%m)/

Esto es directamente aplicable a entornos que utilizan infraestructura dedicada de Hosting de Correo Electrónico donde la gestión de buzones se realiza a nivel del sistema de archivos.

mv vs. cp + rm vs. rsync: cuándo usar cada uno

EscenarioMejor herramientaRazón
Renombrar o mover en el mismo sistema de archivosmvLlamada al sistema rename(2) atómica; cero I/O
Movimiento entre sistemas de archivos, archivos pequeñosmvAceptable; la copia-y-eliminación es automática
Movimiento entre sistemas de archivos, datos grandes o críticosrsync --remove-source-filesVerificación de suma de comprobación; reanudable
Mover con deduplicación o control de ancho de bandarsyncAdmite --bwlimit, --checksum, transferencia delta
Mover y mantener el origen intactocp y luego verificarControl explícito sobre ambas copias
Mover con transformación (compresión, etc.)Script personalizadomv no transforma datos
Movimiento masivo con filtradofind + mv -tControl preciso sobre los criterios de selección

Errores comunes y cómo evitarlos

Ambigüedad de barra final con directorios:

mv directory_a/ directory_b

Si directory_b existe, directory_a se coloca *dentro* de directory_b, resultando en directory_b/directory_a/. Si directory_b no existe, directory_a se renombra a directory_b. Este comportamiento sorprende a muchos administradores. Usa mv -T para forzar que el destino sea tratado como una ruta de archivo, no como un directorio contenedor.

Expansión de comodines sin coincidencias:

mv *.log /archive/

Si no existen archivos .log, el shell expande *.log a la cadena literal *.log, y mv intenta mover un archivo literalmente llamado *.log, lo que falla con un error confuso. Usa nullglob en scripts bash:

shopt -s nullglob
files=(*.log)
[[ ${#files[@]} -gt 0 ]] && mv "${files[@]}" /archive/

Condiciones de carrera en entornos concurrentes:

Múltiples procesos moviendo archivos desde un directorio de cola compartido pueden causar conflictos. Usa mv con un nombre temporal único y luego renombra atómicamente:

mv /spool/job_123.tmp /spool/processing/job_123.work

Dado que rename(2) es atómico, este patrón es seguro para colas de trabajos en un único sistema de archivos.

Mover archivos con nombres que comienzan con un guion:

mv -- -oddfile.txt /destination/

El -- indica el fin de las opciones, evitando que -oddfile.txt sea interpretado como un indicador.

Permisos después de movimientos entre sistemas de archivos:

mv no preserva atributos extendidos (xattrs), ACLs ni contextos SELinux en todos los tipos de sistemas de archivos. Después de un movimiento entre sistemas de archivos, verifica con:

ls -lZ /destination/file
getfattr -d /destination/file

Uso confiable de mv en scripts de producción

Para cualquier script que use mv en un contexto de producción, aplica estas prácticas de forma incondicional:

#!/usr/bin/env bash
set -euo pipefail

SOURCE="/var/data/export"
DEST="/mnt/nas/backup/$(date +%Y%m%d)"

# Verify source exists
[[ -e "$SOURCE" ]] || { echo "Source not found: $SOURCE" >&2; exit 1; }

# Verify destination is writable
mkdir -p "$DEST"
[[ -w "$DEST" ]] || { echo "Destination not writable: $DEST" >&2; exit 1; }

# Perform move with verbose output for logging
mv -v "$SOURCE" "$DEST/"
  • set -euo pipefail garantiza que el script salga ante cualquier error, variable no definida o fallo en una tubería.
  • Las verificaciones explícitas de existencia y permisos de escritura previenen fallos silenciosos.
  • La salida detallada crea un registro de auditoría en los logs del sistema.

Matriz de decisión: elegir las opciones correctas de mv

SituaciónIndicadores recomendados
Interactivo, archivo único, estado de destino desconocido-i -v
Script automatizado, el destino no debe ser sobrescrito-n
Script automatizado, siempre sobrescribir-f
Despliegue con capacidad de reversión--backup=numbered
Movimiento estilo sincronización, solo archivos más recientes-u
Movimiento masivo mediante find o xargs-t /destination/
Depuración de un script-v
Archivos con nombres especiales (guiones, espacios)-- antes del origen

Conclusiones técnicas clave

  • mv en el mismo sistema de archivos es atómico y produce cero I/O de disco — es una operación solo de metadatos a través de rename(2).
  • mv entre sistemas de archivos es una copia-y-eliminación secuencial; trátalo como cp para la planificación de confiabilidad.
  • No existe el indicador -r en GNU mv — los directorios se mueven de forma recursiva por defecto.
  • --backup=numbered es la función de seguridad de producción más infrautilizada en mv.
  • --no-clobber (-n) y --force (-f) son mutuamente excluyentes; el último especificado tiene prioridad.
  • Para migraciones de datos críticos entre sistemas de archivos, rsync --remove-source-files proporciona verificación de suma de comprobación que mv no puede ofrecer.
  • Siempre entrecomilla las variables en los scripts y usa -- para manejar nombres de archivos con caracteres especiales.
  • Verifica los contextos SELinux y las ACLs después de cualquier movimiento entre sistemas de archivos en entornos con seguridad reforzada.

Preguntas frecuentes

¿Funciona mv de manera diferente en SSD en comparación con HDD?

Para movimientos en el mismo sistema de archivos, no — la operación es una actualización de metadatos independientemente del hardware de almacenamiento. Para movimientos entre sistemas de archivos, los SSD reducen el tiempo de reloj de la fase de copia, pero el comportamiento lógico y los riesgos son idénticos.

¿Por qué mv a veces tarda mucho tiempo incluso para un archivo pequeño?

Si el origen y el destino están en sistemas de archivos diferentes — incluyendo montajes NFS, tmpfs o particiones separadas — mv realiza una copia completa. Incluso un archivo pequeño movido a través de un montaje de red lento será lento. Verifica con df -h source destination para confirmar si comparten un sistema de archivos.

¿Se puede usar mv para mover archivos entre contenedores o volúmenes Docker?

No directamente. Los volúmenes Docker son espacios de nombres de sistemas de archivos separados. mv dentro de un único volumen funciona normalmente, pero mover datos entre volúmenes requiere operaciones de tipo cp, típicamente a través de docker cp o un bind mount compartido.

¿Qué sucede si mv se interrumpe a mitad de una operación en un movimiento entre sistemas de archivos?

El archivo de origen permanece intacto hasta que la copia se completa y la desvinculación tiene éxito. Si el proceso se termina después de la copia pero antes de la desvinculación, ambas copias existen. Si se termina durante la copia, el archivo de destino parcial permanece y el origen no se toca. Siempre verifica ambas rutas después de un mv entre sistemas de archivos interrumpido.

¿Es seguro usar mv en trabajos cron sin indicadores interactivos?

Sí, siempre que uses -f o -n explícitamente para suprimir cualquier confirmación (que causaría que el trabajo cron se quede bloqueado), valides las rutas antes de ejecutar y redirijas tanto stdout como stderr a un archivo de log para auditabilidad.

15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar