información de progreso a través de pv para copiar el directorio

14

Necesito copiar un directorio muy grande (hablando en terabytes aquí) y quiero monitorear el progreso.

Descubrí que pves una buena utilidad, pero ¿cómo puedo usarla para copiar directorios de forma recursiva? ( pv src > dstno funciona porque son directorios)

PD: se ejecutó en OS X Mountain Lion, pvse instaló desde puertos Mac

FP
fuente

Respuestas:

21

Utilizar rsync --progress [SRC] [DST]

Verifique la man rsyncpágina porque tiene muchas opciones muy útiles. -apara el archivo es un buen comienzo, pero depende de sus requisitos exactos.

Copiar a través de una tubería ralentizará innecesariamente el proceso de copia, especialmente si se basa en archivos.

jippie
fuente
¿Por qué copiar a través de una tubería ralentizaría el proceso? Es probable que el almacenamiento en búfer proporcionado por las tuberías y la multitarea asociada con las tuberías ayude a los asuntos, diría yo. (y rsync es multiprocesos y utiliza tuberías internamente IIRC). ¿Qué es un proceso de copia que no está basado en archivos?
Stéphane Chazelas
Bash es conveniente, pero no rápido. Especialmente cuando se conecta un comando al otro.
jippie
@StephaneChazelas: porque el búfer de una tubería es de solo 8 KB. Un programa como rsync podría querer usar un búfer interno mucho más grande.
Zan Lynx
10

Puede usar taro paxo cpio:

mkdir -p dst &&
  (cd src && tar cf - .) | pv -trb | (cd dst && tar xpf -)
Stéphane Chazelas
fuente
1
Además, puede agregar una val tarcomando para ver los nombres de los archivos.
Peter
Entonces esto comprimirá la carpeta de origen antes de hacer la copia, ¿verdad? Mi carpeta tiene un tamaño de 5 TB, así que no estoy seguro de si esta es la mejor manera de hacerlo. Realmente me gusta usar pv ya que muestra un muy buen estado de progreso, ¿algún consejo por favor?
Tak
@Tak, no, no comprime nada ya que no hay compresión. tar cf -genera un flujo que contiene los archivos y sus metadatos, que se alimenta a través de una tubería a pv que lo alimenta sin tocar al otro tarmientras imprime una indicación de progreso, y el otro tarextrae los datos en ese flujo. Los tres comandos se ejecutan simultáneamente y procesan los datos tal como vienen, no hay nada almacenado en el disco, no hay nada almacenado en la memoria que no sean los almacenamientos intermedios de tuberías y los almacenamientos intermedios de comandos que solo ascienden a unos pocos kilobytes.
Stéphane Chazelas
@ StéphaneChazelas Gracias por el comentario. Lo he probado y está funcionando, lo único es que la barra de progreso no muestra el porcentaje esperado que sigue yendo de izquierda a derecha. ¿Alguna idea de por qué? Utilicé pv con estos parámetros -petra que generalmente muestra la barra de progreso donde la barra se llenó hasta que termina. También he votado tu respuesta.
Tak
@Tak, pvno tiene forma de saber cuántos datos hay que transferir. Si tiene una estimación de esa cantidad, puede pasársela con la -sopción (GNU du -sb srcle daría una buena aproximación si los archivos son lo suficientemente grandes)
Stéphane Chazelas
2

Alquitrán.

tar -cf - /var/log/ | pv | tar -C . -x

Ejemplo:

# tar -cf - /var/log/ | pv | tar -C . -x
tar: Removing leading `/' from member names
58MB 0:00:05 [ 2.2MB/s] [                   <=> 
Temor anómalo
fuente
1

Aquí hay algunos comandos para copiar directorios con información de progreso.


Si hay muchos archivos pequeños:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

Esto informará el progreso en función del número de archivos que se copian.

Puede redirigir a /dev/nullsi no lo necesita logfile.

Use el siguiente comando para obtener filecount:

find sourcedir | wc -l

Si hay pocos archivos enormes:

tar c sourcedir | pv -s size | tar x -C targetdir

Esto informará el progreso en función de los bytes que se copian.

targetdir debe existir

Use el siguiente comando para obtener size:

du -sh sourcedir

Si quieres usar rsync:

rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile

Obtenga filecountcomo se muestra arriba.

Si está copiando en el mismo sistema, entonces rsync -aes prácticamente igual que cp -a. Las ventajas de rsync es cuando está copiando a través de la red o si está actualizando (o comparando) una copia anterior.

Vea aquí para más detalles:

lesmana
fuente
0

Puede hacer du -b /directory/tanto en el origen como en el destino mientras se está ejecutando un comando de copia normal y comparar los dos. Esto es igual de efectivo y no ralentiza el proceso de copia empujándolo a través de una tubería.

Apóstol
fuente
-1
find source-dir -print0 | xargs -0 -I % pv % > dest-dir/%
Christopher Hilla
fuente
3
Por favor, explique la solución del tour, querrá que OP pueda chequearlo (y aprender)
vonbrand