bash - todos - ¿Cómo puedo hacer una barra de progreso(copiar cp un directorio)?
mover todos los archivos de un directorio a otro linux (9)
Supongo que podría comparar el número 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).
¿Qué tal algo así como
find . -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /DEST/$(dirname {})
Encuentra todos los archivos en el directorio actual, canaliza a través de PV mientras proporciona PV un tamaño estimado para que el medidor de progreso funcione y luego lo conecta a un comando de CP con el indicador --parents para que la ruta DEST coincida con la ruta SRC.
Un problema que aún tengo que superar es que si 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 / user / test / .... FILES ... y 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.
Aquí otra solución: use la bar
herramientas
Podrías invocarlo así:
#!/bin/bash
filesize=$(du -sb ${1} | awk ''{ print $1 }'')
tar -cf - -C ${1} ./ | bar --size ${filesize} | tar -xf - -C ${2}
Tienes que recorrer el camino sobre el alquitrán, y será inexacto en archivos pequeños. También debe tener cuidado de que exista el directorio de destino. Pero es una forma.
Hay una herramienta pv
para hacer esto exactamente: http://www.ivarch.com/programs/pv.shtml
Hay una versión de Ubuntu en apt
Mi opción preferida es Copia avanzada , ya que utiliza los archivos originales de cp
fuente.
$ 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 ahora se encuentran en src / cp y src / mv. Puede optar por reemplazar sus comandos existentes:
$ sudo cp src/cp /usr/local/bin/cp
$ sudo cp src/mv /usr/local/bin/mv
Para agregar otra opción, puede usar cpv
. Utiliza pv
para imitar el uso de cp
.
Funciona como pv
pero puede usarlo para copiar directorios recursivamente
Puedes obtenerlo here
Para mostrar una barra de progreso mientras se hace una copia recursiva de archivos y carpetas y subcarpetas (incluidos enlaces y atributos de archivos), puede usar gcp
(se instala fácilmente en Ubuntu y Debian ejecutando "sudo apt-get install gcp"):
gcp -rf SRC DEST
Aquí está el resultado típico al copiar una gran carpeta de archivos:
Copying 1.33 GiB 73% |##################### | 230.19 M/s ETA: 00:00:07
Tenga en cuenta que muestra solo una barra de progreso para toda la operación, mientras que si quiere una única barra de progreso por archivo, puede usar rsync
:
rsync -ah --progress SRC DEST
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/ Manpage se puede encontrar aquí: http://linux.die.net/man/1/vcp
La mayoría de las distribuciones tienen un paquete para eso.
Una forma simple de unix es ir al directorio de destino y 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 : Sin barra de progreso
También puede usar rsync
lugar de cp
así:
rsync -Pa source destination
Lo cual le dará una barra de progreso y tiempo estimado de finalización. Muy útil.