¿Línea de comando recursiva / copia de directorio profunda en Linux?

13

¿Cuál es una buena forma general de hacer una copia de directorio recursiva / profunda en Linux que funcione en la mayoría de los casos? He usado cosas simples como encantamientos cp -Rbastante elaborados cpio. ¿Hay fortalezas o debilidades significativas que te hagan preferir una sobre la otra? ¿Cuál usas con más frecuencia?

Greg Mattes
fuente

Respuestas:

29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

Entonces, en respuesta a tu pregunta:

cp -a /foo /bar

Copie todo de forma recursiva desde el directorio / foo al directorio / barra mientras conserva los enlaces simbólicos y el 'modo' 'propiedad' y 'marcas de tiempo' del archivo / directorio.

Gareth
fuente
Esta es ciertamente una solución muy sencilla y elegante. ¿Alguna vez ha encontrado inconvenientes en este enfoque? Sistemas de archivos distribuidos? Copias extremadamente grandes? ¿Ha encontrado otras soluciones como cpio, tar o rsync para ser más eficientes en algunos casos?
Greg Mattes
1
A menos que haya un error físico, nunca he tenido un error 'cp' local desde la memoria (solo he realizado transferencias del tamaño de TB) a cualquier lugar montado localmente (independientemente del montaje de NFS o Samba). Consulte 'USO' en la página de manual de rsync para ver ejemplos que encontrará instructivos. Favorito de los míos: $ rsync --partial --progress --rsh = ssh --archive --verbose --compress foo / user @ hosname: ~ / bar (rsync -avzP)
Gareth
Como señalé anteriormente, -a no es estrictamente portátil.
Matthew Flaschen
Bueno, sé que busybox, GNU y BSD cp están bien. Aparte de las cajas de Unix heredadas que nunca he visto, ¿en qué no funcionará? Realmente no veo el punto de lo contrario, aunque entiendo completamente el sentimiento de Zoredache de "siempre parece hacer el trabajo correctamente, por lo que nunca he tratado de encontrar un reemplazo".
Gareth
@ gyaresu Por favor considere dividir su segundo comentario en otra respuesta para que podamos votarlo.
Greg Mattes
6

Utilizo un comando como "cd $ srcdir; tar -c. | Tar -C $ destdir -x" con mayor frecuencia. Pero también uso rsync -a $ src $ dst.

La mayor fortaleza de la solución tar es que es lo que tuve que usar en un sistema hace muchos años que no tenía cpio, rsync o un cp que se copiaría recursivamente. El alquitrán está prácticamente en todas partes. Está atascado en mi cabeza porque lo usé mucho, probablemente hay formas más elegantes. Siempre parece hacer el trabajo correctamente, por lo que nunca he buscado mucho para encontrar un reemplazo.

Zoredache
fuente
Me gusta mucho el argumento de "la ubicuidad del alquitrán". Soy experto en vi por razones similares, aunque prefiero otros entornos de edición.
Greg Mattes
-R hace tiempo que ha sido parte del estándar ( opengroup.org/onlinepubs/009695399/utilities/cp.html ) aunque no -a.
Matthew Flaschen
@Matthew Flaschen: ¿Su comentario está destinado a la respuesta de @ gyaresu?
Greg Mattes
También es relevante para este, ya que Zoredache dijo que encontró un sistema que "no tenía [...] un cp que se copiara recursivamente". Básicamente, -R -> portátil, -a -> no portátil.
Matthew Flaschen
1
Esto fue en ~ 95 y el sistema ejecutaba una versión de Unix de finales de los 80. No creo que -R fuera una opción para cp, pero no estoy seguro. Aprendí ese tidbit leyendo el usenet.
Zoredache
6

Eche un vistazo a rsync ... Me gusta porque copia menos datos al mantener dos directorios actualizados ... también puede funcionar de forma remota. En su forma más simple, rsync -a / src / dest

Trent
fuente
Este es un muy buen punto. Esencialmente, rsync tiene la capacidad de calcular un "directorio diff" y transferir solo lo que se necesita para sincronizar los directorios. Por lo tanto, puede llamar repetidamente a algo como rsync -a src / dest para "copiar continuamente" directorios de forma recursiva (el src de seguimiento / encendido es necesario para una sincronización adecuada) mientras que cp -a src / dest no funciona así. El comando cp creará un nuevo directorio src en dest después del primer cp. Necesitaría algo como cp -au src / * dest para copias posteriores.
Greg Mattes
La otra razón por la que me gusta rsync es que puedes pasarle el indicador -P, que muestra una barra de progreso. Te da una idea de cuánto tiempo tomará algo
Rory el
0

rsyncEs una gran herramienta. Es la navaja suiza de transferencia de datos. Es una herramienta tan simple y poderosa. Una vez que comienzas a usarlo, te enganchas.

Rory
fuente