2011-08-19 29 views
37

Supongo que podría comparar la cantidad de archivos en el directorio de origen con la cantidad de archivos en el directorio de destino a medida que avanza cp, o quizás hacerlo con el tamaño de la carpeta. Traté de encontrar ejemplos, pero todas las barras de progreso de bash parecen estar escritas para copiar archivos individuales. Quiero copiar un grupo de archivos (o un directorio, si el primero no es posible).¿Cómo puedo hacer una barra de progreso (copiar cp un directorio)?

+11

Usted ha golpeado [Bash FAQ # 44] (http: // mywiki .wooledge.org/BashFAQ/044). Eche un vistazo y vea si alguna de las sugerencias es útil. – jw013

Respuesta

7

Puede echar un vistazo a la herramienta vcp. Es una herramienta de copia simple con dos barras de progreso: una para el archivo actual y otra para general.

EDITAR

Aquí está el enlace a las fuentes: http://members.iinet.net.au/~lynx/vcp/ Página de manual se puede encontrar aquí: http://linux.die.net/man/1/vcp

La mayoría de las distribuciones tienen un paquete para él.

+0

Esperaba algo que no requiera la compilación de herramientas externas. Solo quiero ver mi directorio copiarse. ¿Es realmente tan difícil? – octosquidopus

+0

@Anonymouse agregó una segunda respuesta, tal vez esta sería una alternativa para usted. Pero esa es mi última idea :( –

+1

Como se ha dicho a continuación, rsync está disponible en todos los sistemas (incluso de Mac OS), en contraposición a VCP. – Adrien

4

Aquí otra solución: Utilice la herramienta de bar

Se podría invocar esta manera:

#!/bin/bash 
filesize=$(du -sb ${1} | awk '{ print $1 }') 
tar -cf - -C ${1} ./ | bar --size ${filesize} | tar -xf - -C ${2} 

Tienes que ir por el camino más de alquitrán, y será inexacta en archivos pequeños. También debe tener cuidado de que exista el directorio de destino. Pero es una forma.

+0

al principio, pensé en tarring la carpeta antes de moverlo, pero pensaron que carecería demasiado en elegancia. estaba equivocado. funciona como se esperaba y en realidad podría ser una mejor solución en algunos casos. Gracias! – octosquidopus

49

También puede utilizar rsync en lugar de cp así:

rsync -Pa source destination

Qué le dará una barra de progreso y el tiempo estimado de finalización. Muy útil.

+6

derecha, 'rsync --progress/ruta/a/origen/ruta/a/destination' es impresionante y está disponible en todos los sistemas – Adrien

+0

Funciona al copiar un único archivo también. – Nathan

+0

¿Sucede saber la comparación de velocidad entre rsync y cp? – Allasso

18

Para mostrar una barra de progreso mientras se hace una copia recursiva de archivos & carpetas & subcarpetas (incluyendo enlaces y atributos de archivo), se pueden utilizar gcp (fácilmente instalado en Ubuntu y Debian ejecutando "sudo apt-get install GCP") :

gcp -rf SRC DEST 

Aquí está la salida típica al copiar una gran carpeta de archivos:

Copying 1.33 GiB 73% |#####################  | 230.19 M/s ETA: 00:00:07 

en cuenta que se muestra sólo una barra de progreso para toda la operación, mientras si quieres una sola barra de progreso por archivo, puede utilizar rsync:

rsync -ah --progress SRC DEST 
+1

gcp está basado en Python. POR FAVOR NO UTILICE EN PRODUCCIÓN. No revisé, pero parece que no admite enlaces duros, atributos especiales, etc. – socketpair

+0

gcp no funciona en un terminal remoto (por ejemplo, a través de ssh). –

2

Un manera sencilla Unix es ir al directorio de destino y hacer watch -n 5 du -s. Quizás hacerlo más bonito mostrándose como un bar. Esto puede ayudar en entornos en los que solo tiene las utilidades estándar de Unix y no tiene el alcance de instalar archivos adicionales. du-sh es la clave, ver es solo hacer cada 5 segundos. Pros: funciona en cualquier sistema Unix Contras: No Barra de progreso

1

Mi opción preferida es Advanced Copy, ya que utiliza los cp archivos originales.

$ wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz 
$ tar xvJf coreutils-8.21.tar.xz 
$ cd coreutils-8.21/ 
$ wget --no-check-certificate https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch 
$ patch -p1 -i advcpmv-0.5-8.21.patch 
$ ./configure 
$ make 

Los nuevos programas se encuentran ahora en src/cp y src/mv. Usted puede optar por reemplazar sus comandos existentes:

$ sudo cp src/cp /usr/local/bin/cp 
$ sudo cp src/mv /usr/local/bin/mv 
+0

El enlace al parche en zwicke.org está roto pero está en github en https://github.com/atdt/advcpmv. Quizás alguien con más habilidades que yo actualizará los pasos de @ elboletaire. – Setaa

+0

Puedo hacerlo, gracias por los enlaces al parche – elboletaire

0

¿Qué tal algo así como

find . -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /DEST/$(dirname {}) 

Se encuentra todos los archivos en el directorio actual, tuberías que a través de PV mientras que da PV un tamaño estimado de manera el medidor de progreso funciona y luego conectarlo a un comando CP con la bandera --parents para que la ruta DEST coincida con la ruta SRC.

Un problema que todavía tienen que superar es que si se emite este comando

find /home/user/test -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /www/test/$(dirname {}) 

la ruta de destino se convierte en/www/test/home/usuario/test/ARCHIVOS .... ... y yo No estoy seguro de cómo decirle al comando que se deshaga de la parte '/ home/user/test'. Por eso tengo que ejecutarlo desde el directorio de SRC.

0

Para añadir otra opción, puede utilizar cpv. Utiliza pv para imitar el uso de cp.

Funciona como pv pero se puede utilizar para copiar recursivamente directorios

enter image description here

Se puede conseguir here

Cuestiones relacionadas