¿Cómo puedo mover archivos y ver el progreso (por ejemplo, con una barra de progreso)?


118

Al mover directorios grandes usando mv, ¿hay alguna forma de ver el progreso (%)? El cpcomando en gentoo tenía un -ginterruptor que mostraba el progreso.


3
Medir el rendimiento de la tubería en el shell podría ayudar, aunque no sé si es posible usar fácilmente esas herramientas al mover un archivo
Michael Mrozek

Respuestas:


50

Puede construir un cp y un mv parcheados que luego admiten el modificador -g para mostrar el progreso. Hay instrucciones y parches en esta página . Sin embargo : la página te indica que hagas

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv

que sobrescribe el original cp y mv. Esto tiene dos desventajas: en primer lugar, si un paquete actualizado de coreutils llega a su sistema, se sobrescribe. En segundo lugar, si la versión parcheada tiene un problema, podrían romper los scripts que dependen de cp y mv estándar. Prefiero hacer algo como esto:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg

que copia los archivos a / usr / local / bin que está destinado a los programas compilados por el usuario y les da un nombre diferente. Entonces, cuando quieres una barra de progreso, dices mvg -g bigfile /mnt/backupy usas mv normalmente.

También puede hacerlo alias mvg="/usr/local/mvg -g", solo necesita decir mvg bigfile /mnt/backupy obtener directamente la barra de progreso.


2
Desafortunadamente, el parche en "esta página" ya no está presente y no parece haber sido indexado en el Archivo Web. Parece que hay muchos parches con un nombre y una función similares , ¿podría editar su respuesta para aclarar a cuál se refería?
Gilles

Creo que github.com/atdt/advcpmv es un sucesor válido y tiene el mismo parche, así que cambié el enlace para señalarlo.
fschmitt

93

No me gusta la idea de sobrescribir binarios de coreutil cuando hay soluciones más simples, así que aquí están las mías:

rsync : Rsync copia archivos y tiene un -Pinterruptor para una barra de progreso. Entonces, si tiene instalado rsync, puede usar un alias simple en su archivo de puntos de shells:

alias cp='rsync -aP'

La desventaja es que rsync es un poco más lento que cp, pero debes medir esto con el tiempo y decidir por ti mismo, puedo vivir con eso :-)

Shell Script : Un script de shell también puede crear la barra de progreso. Encontré esto hace un tiempo en la red y no recuerdo la fuente:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
}

Esto se verá así:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

bar :

'bar' - 'cat' con barra de progreso ASCII

bares un pequeño script de shell para mostrar una barra de proceso para todo tipo de operaciones (cp, tar, etc.). Puede encontrar ejemplos en la página de inicio del proyecto.

También está escrito para el caparazón de bourne, por lo que se ejecutará cerca de todas partes.


3
barno se envuelve mvtodavía.
Tobu

55
Crédito por el script de shell
Lamnk

1
Tenga en cuenta que rsyncno reemplaza mv(el OP pregunta) por completo, especialmente cuando se trata de copias rápidas en sistemas de archivos de copia en escritura como btrfs.
Karl Richter

74

Hay una nueva herramienta llamada progressque puede encontrar cualquier descriptor relacionado con un comando en ejecución y mostrar el progreso y la velocidad: disponible aquí

progress -w

genera las estadísticas para todas las operaciones de cp, mv, etc. en ejecución


3
¡GUAU, no esperaba que esto fuera tan increíble! Simplemente escribí progressdespués de la instalación y me presentó el progreso del mvcomando que estaba esperando actualmente. ¡Gracias!
jredd

3
¡Gracias! Cuando mueves cosas como raíz, parece que tienes que usar sudo(el mismo usuario, supongo). También puedes usar watchpara decir lo que sucede cada 2 segundos:watch progress -w
Wilf

66
Impresionante programa, pero cuando se mueve, por ejemplo, una carpeta con muchos archivos, solo muestra el progreso del archivo actual, no la carpeta completa en total. En lugar de watch progress -wusted también puede simplemente usarprogress -m
mxmlnkn

66
En mi humilde opinión, esta es la forma más unix para resolver el problema. En lugar de parchear coreutils o usar herramientas que no están designadas para propósitos específicos (como rsync para mv) o escribir scripts exagerados, simplemente use esa herramienta escrita para el propósito del tema con amor.
Dolor

34

Puede usar el comando del visor de tuberíaspv para mostrar la barra de progreso:

pv /original/file > /new/file

A menudo uso esto para copiar un archivo grande en un sistema de archivos de red montado (combinar con gzipy tar). El inconveniente es que solo puede copiar un archivo y no un directorio. Y debe darle un nombre al nuevo archivo, no puede simplemente darle al directorio de destino como lo cphace. Sin embargo, copiar no pves el propósito. Es una herramienta poderosa y hace mucho más que simplemente copiar archivos. Vea la página de inicio para más ejemplos de pv.

Una opción mucho mejor es usar rsync -aP. Si lo desea mv, agregue la bandera --remove-source-files. Agregue esto a su .bashrcsi desea usar los comandos con frecuencia:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

La desventaja aquí es que rsync solo muestra el progreso, no una barra de progreso.


tar cf - source-dir | pv | tar xf - -C out-dirle dará el rendimiento de un directorio completo. Si conoce el tamaño y pasa -sa pv, también puede darle progreso.
arantius

6

Si su objetivo es mover / copiar un directorio con barra de progreso, pero evitando la GUI no terminal, mc (Midnight Commander) es una buena opción.


3

Mi solución es usar rsync. Puede copiar directorios, eliminar los archivos de origen después de una copia exitosa (por lo tanto, "moverlos") y mostrar informes de progreso, entre muchas otras características (especialmente la sincronización de directorios parcialmente copiados y el trabajo en la red).

Así es como movería un directorio con rsync, con informe de progreso:

rsync -aP --remove-source-files $src $dst && rm -r $src

Asegúrese de $srcno no terminar en una barra invertida, de lo contrario obtendrá un significado diferente que el de GNU cp.

Se rm -rnecesita al final porque --remove-source-filessolo elimina los archivos de origen, después de que cada uno se copia correctamente, no los directorios. Se &&asegura de ejecutarlo solo si rsync se completa con éxito. Si eres paranoico, puedes reemplazarlo con algún tipo de recursivo rmdir, comofind $src -d -exec rmdir {} +

La única falla es que la -Popción muestra el progreso para cada archivo, no para toda la operación de copia. Esto podría ser inútil si está intentando mover un directorio con muchos archivos pequeños. La última versión de desarrollo de rsync tiene un indicador alternativo --info=progress2que muestra el progreso de toda la operación.


2

Para evitar parches de Coreutil para agregar una barra de progreso mvy cp, gcp(Goffi's CoPier) es una nueva alternativa: http://wiki.goffi.org/wiki/Gcp/en

Usar de la misma manera que cpcon las opciones -rde recursividad y -vde verbosidad.

Utiliza una cola de archivos cuando se invocan varios comandos simultáneamente. También permite grabar nombres de archivos copiados en un registro, consulte la sección de la página del manual de guardado de Fuente para más detalles.

Aquí hay un buen tutorial para comenzar gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/


¿Hay gmv como gcp para cp?
CodyChan

No he encontrado un equivalente. Por cierto, no hay necesidad de barra de progreso cuando se ejecuta "mv" en un solo sistema de archivos ... es bastante rápido. Si el movimiento se realiza a través de dos sistemas de archivos diferentes, se implementa como cp y luego elimina el origen si tiene éxito, o elimina el destino si falla. Un simple script de shell basado en gcp puede hacerlo correctamente (con una primera verificación para saber si la fuente y el destino están realmente en diferentes sistemas de archivos)
Yves Martin

2

En primer lugar: nunca copio archivos grandes sin usar ionice, a menos que sepa que no querré usar la computadora durante media hora o más.

Segundo: todas mis particiones se agrupan, por lo que la copia intrapartición no lleva tiempo. Si es una copia larga, hago un du -smen los archivos y df -m | grep copy_to_partition. Entonces, si tengo curiosidad por cuánto tiempo más me llevará, lo vuelvo a hacer dfy veo cuánto de los archivos se copiaron.


¿Te gustaría compartir tus consejos de ionice? ¿Qué prioridad le darías a mv cpu-wise y disk I / o wise? Aquí están mis configuraciones, pero la carga de la CPU sigue siendo alta incluso después de volver a hacer un cambio de imagen: imgur.com/a/DLMJplz
ychaouche

2

En mi Mint, me gusta usar gcp en esto o en la solución curl (que es realmente agradable)

gcp SOURCE DESTINATION

Es posible que deba instalarlo sudo apt-get install gcp

Y una tarea muy agradable y excelente para la barra de progreso con información sobre

  • % Total
  • % Recibido
  • % Xferd
  • DL promedio
  • Velocidad de carga
  • Tiempo restante
  • Tiempo usado
  • Tiempo total
  • Velocidad actual

en un buen formato legible es:

curl -o DESTINATION FILE://source

Además, es posible que deba instalarlo primero sudo apt-get install curl


gcpno admite el movimiento del archivo, es decir, los archivos de origen deben eliminarse manualmente después de una copia exitosa.
Karl Richter

2

Esto no le da una barra de progreso, pero presione CTRL-Ty enviará un correo electrónico SIGINFOa mv, que informará en qué archivo está trabajando y qué tan avanzado está el proceso. Es bastante útil tener esto para transferencias de archivos grandes, posiblemente no tan útil para una transferencia con muchos archivos pequeños.

Ejemplo rápido:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%

1
Esto no funcionó para mí: INFO: unknown signal; killall -l lists signals. creo que SIGINFO solo está en algunos BSD, no en POSIX estándar.
Brian Minton

2
Derecha. Funciona en Mac OS X, pero probablemente no en, por ejemplo, Ubuntu.
Charles

1

Utilícelo mv -vpara imprimir una línea por archivo movido e pv -limprimir el progreso en función del recuento de líneas (en efecto, recuento de archivos).

Necesitará pv(visor de tuberías): http://www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

Use el siguiente comando para obtener el recuento de archivos:

find sourcedir | wc -l

Este comando mostrará información de progreso en función del número de archivos copiados. Esto funciona mejor si hay muchos archivos pequeños. Si solo hay unos pocos archivos que son enormes, entonces no te divertirás mucho.

Tenga mven cuenta que en la misma partición debe ser rápido. mva otra partición sería lo mismo cp source targetseguido por rm source. Así que aquí hay dos comandos para copiar directorios con información de progreso.

para informar el progreso en función del número de archivos copiados:

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

para informar el progreso en función de los bytes copiados:

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

Consulte aquí para obtener más detalles: información de progreso a través de pv para la copia del directorio


1

Invariablemente, termino buscando esta respuesta después de iniciar el comando 'mv', en cuyo punto no quiero comenzar de nuevo. Si se encuentra en esta situación, una forma muy simple de monitorear el progreso (o para ver si está lo suficientemente lejos como para que no valga la pena matar) es ejecutar:

du -hs /directory/you're/moving/data/to

Esto solo imprimirá el tamaño del directorio para que pueda ver cuántos datos se han copiado, o puede ejecutarlo un par de veces para ver qué tan rápido se transfieren los datos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.