Linux / Comando cp: copiar archivos y directorios y verificar el resultado

cp es un comando que copia archivos o directorios a otra ruta. Ofrece diversas opciones, desde la copia básica hasta la copia recursiva, preservación de permisos, tiempo y enlaces, así como prevención de sobrescritura, pero es necesario distinguir con precisión entre la forma del origen y del destino.

En este artículo, se explica la sintaxis básica del cp de GNU Coreutils, las diferencias entre -r y -a, la protección de archivos de destino, el manejo de enlaces simbólicos y los métodos de verificación de copias de gran tamaño.

¿Qué es el comando cp?

Por defecto, cp crea una copia lógica cuyo contenido se puede modificar independientemente del original. No confunda esa independencia con una duplicación física garantizada: un sistema de archivos con copia al escribir puede compartir bloques hasta que se modifiquen. Para directorios, use una opción recursiva como -R o -a.

Sintaxis básica

cp [OPCIONES] ORIGEN DESTINO
cp [OPCIONES] ORIGEN... DIRECTORIO
cp [OPCIONES] -t DIRECTORIO ORIGEN...

Ejecute los ejemplos independientes en un directorio de práctica nuevo, con archivos y carpetas preparados para cada caso. Use comillas para rutas con espacios y -- antes de nombres que empiecen por guion. Revise las opciones de su implementación con cp --help y man cp. Las órdenes sobre /etc y /backup son ejemplos administrativos que requieren adaptar las rutas y permisos.

Uso básico de cp

Copiar un archivo con un nuevo nombre

Al especificar dos rutas, el primer archivo se copia a la segunda ruta.

cp report.txt report-backup.txt

Copiar varios archivos a un directorio

Si hay varios originales, el último argumento debe ser un directorio existente.

cp index.html style.css public/

Copiar directorios recursivamente

Copie el árbol de directorios con -R o -r. Si la preservación de metadatos es importante, como en copias de seguridad o despliegues, consulte -a.

cp -R src src-copy
cp -a app/ app-backup/

Verificar que los archivos copiados sean iguales

cp normalmente no produce salida incluso si tiene éxito. Para una copia importante, verifique no solo la existencia del archivo de destino sino también su contenido.

printf 'demo\n' > original.txt
cp original.txt copy.txt
cmp -s original.txt copy.txt
echo $?

La salida de ejemplo es 0, lo que significa que el contenido en bytes de ambos archivos es igual. Sin embargo, cmp no verifica si los metadatos como propiedad, permisos o atributos extendidos son iguales, por lo que si es necesario, también verifique stat.

Opciones principales

Opciones Descripción
-R, -r Copiar directorios y su contenido recursivamente.
-a, --archive Realice una copia recursiva preservando los atributos posibles y la estructura de enlaces.
-p Se conservan modos, propiedad y marcas de tiempo tanto como sea posible.
-i Verificar antes de sobrescribir un destino existente.
-n, --no-clobber No sobrescribe los archivos destino existentes. Para acciones detalladas según la versión, consulte la sección de ayuda.
-u, --update Dependiendo de las condiciones, como si no hay objetivo o si el original es más reciente, se copia.
-v Muestra el nombre de los archivos que copia.
-T Trata el destino como un camino exacto en lugar de un directorio.
-t DIR Primero, especifica el directorio destino como una opción.
--reflink[=WHEN] Intenta clonación copy-on-write en sistemas de archivos compatibles.

Las opciones largas facilitan entender su significado y también ayudan a revisar scripts. Sin embargo, en scripts donde la portabilidad es importante, primero verifique si el sistema objetivo soporta esas opciones de extensión GNU.

Ejemplos de uso práctico

Confirmar o evitar sobrescrituras

Use -i para confirmar una sobrescritura y -n para conservar destinos existentes. En algunas versiones, omitir un archivo con -n no produce un estado de error: compruebe los archivos resultantes y la ayuda de la versión instalada. Prepare antes un directorio backup de práctica y archivos desechables para los ejemplos; no utilice una copia de seguridad real como destino de prueba.

cp -iv config.ini backup/
cp -nv *.conf backup/

Conservar atributos y hacer copias de seguridad

-a intenta conservar enlaces simbólicos, permisos, marcas de tiempo, etc., junto con la copia recursiva. Las listas de control de acceso (ACL), los atributos extendidos, contexto SELinux y propiedad pueden no conservarse completamente según el sistema de archivos y permisos.

sudo cp -a /etc/myapp/ /backup/myapp/
cp -a --preserve=all source/ destination/

Verificar los resultados de la copia

Para archivos importantes, no solo revise el tamaño, compare también la suma de verificación o el número de archivos. En entornos donde el original se modifica durante la tarea, puede ser necesario un snapshot consistente o herramientas de sincronización dedicadas.

sha256sum source.img copied.img
diff -qr source-dir copied-dir

Comparación de cp con comandos relacionados

Comando / método Rol principal Situaciones adecuadas
cp Copiar archivos y directorios locales Tarea de copia simple y clara
mv Mover o cambiar el nombre de la ruta Cuando no es necesario dejar en la ubicación original
rsync Sincronización incremental o remota y reglas detalladas de exclusión Copiado repetido a gran escala o transferencia de red
install Configuración de permisos y propiedad al mismo tiempo que la copia Etapas de instalación y distribución del programa

Precauciones al usar

Verificar el significado del directorio de destino

Si source es un directorio y dir no existe, cp -R source dir crea dir con el contenido del origen. Si dir ya existe, copia el árbol a dir/source. Para copiar solo el contenido, incluidos los nombres ocultos, puede usar cp -a source/. dir/ tras revisar el destino. -T y -t ayudan a expresar otras intenciones, pero no sustituyen esta comprobación.

-a no garantiza una copia de seguridad completa

No se puede afirmar que se conservará todo el estado debido a las funciones del sistema de archivos, permisos, archivos abiertos y cambios en ejecución. Para los datos del servicio, utilice procedimientos de respaldo adecuados a la aplicación.

Distinguir los patrones de la shell de los archivos ocultos

cp -a source/* dest/ de * generalmente excluye elementos ocultos. Para conservar el contenido del directorio en sí, revise la notación de rutas y el alcance de inclusión.

FAQ

¿Cuál debo usar al copiar un directorio, -r o -a?

Para una copia recursiva simple, -R está bien; para conservar posibles atributos como permisos, tiempos y estructura de enlaces simbólicos, -a es adecuado.

¿Cómo evitar sobrescribir archivos existentes?

En GNU cp, puede usar -n. En automatizaciones importantes, verifique también el resultado y el comportamiento de la versión instalada.

¿Qué copia cp -a source/ dest/?

El resultado puede variar dependiendo de la existencia del destino y de cómo se indique la ruta. Primero, verifique en un directorio de prueba y aclare su intención con -T o -t.

¿Cómo se verifica si la copia fue correcta?

Para los archivos, se puede usar suma de verificación; para los directorios, puede comparar diff -qr o la lista y cantidad de archivos. Las copias de seguridad importantes deben ser probadas hasta la restauración.

Para comparar otras herramientas, consulte la Lista de comandos de uso frecuente en Linux. Para consultar las reglas y opciones, use Documentación oficial de GNU Coreutils cp y Manual oficial de GNU Coreutils.