it-swarm-es.tech

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

Al mover directorios grandes usando mv, ¿hay alguna forma de ver el progreso (%)? El comando cp en gentoo tenía un -g interruptor que mostró el progreso.

129
letronje

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/backup y usa mv normalmente.

También puedes hacer alias mvg="/usr/local/mvg -g" entonces solo necesitas decir mvg bigfile /mnt/backup y obtenga directamente la barra de progreso.

50
fschmitt

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 -P cambiar a 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 tiempo y decidir por ti mismo, puedo vivir con eso :-)

Script de Shell : 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% [===============================>                      ]

barra :

‘Bar’ - ‘cat’ con ASCII barra de progreso

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

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

96
echox

Hay una nueva herramienta llamada progress que 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

92
naugtur

Puede usar visor de tuberías comando pv 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 gzip y 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 hace cp. Sin embargo, copiar no es el propósito de pv. Es una herramienta poderosa y hace mucho más que simplemente copiar archivos. Consulte la página de inicio para obtener más ejemplos de pv.

Una opción mucho mejor es usar rsync -aP. Si desea mv en su lugar, agregue la bandera --remove-source-files. Agregue esto a su .bashrc si desea utilizar 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.

36
Lamnk

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.

6
Christian Madsen

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 que $src Hace not termina en una barra diagonal inversa, de lo contrario obtendrá un significado diferente al de GNU cp.

El rm -r Al final es necesario porque --remove-source-files Solo 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, como find $src -d -exec rmdir {} +

La única falla es que la opción -P 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=progress2 Que muestra el progreso de toda la operación.

4
Tobia

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 están agrupadas, por lo que la copia intrapartición no lleva tiempo. Si es una copia larga, hago un du -sm en los archivos y df -m | grep copy_to_partition. Entonces, si tengo curiosidad por cuánto tiempo más me llevará, hago el df nuevamente y veo cuánto de los archivos se copiaron.

2
HandyGandy

Esto no te da una barra de progreso, pero presiona CTRL-T y enviará un SIGINFO a 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%
2
Charles

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
  • Carga rápida
  • Tiempo restante
  • Tiempo usado
  • Tiempo total
  • Velocidad actual

en un formato agradable legible es:

curl -o DESTINATION FILE://source

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

2
ThePentadactyl

Para evitar los parches coreutil para agregar la barra de progreso a mv y cp, gcp (Goffi's CoPier) es una nueva alternativa: http: //wiki.goffi. org/wiki/Gcp/en

Para usar de la misma manera que cp con opciones -r para recursividad y -v para 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 Guardar fuente sección de la página del manual para más detalles.

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

2
Yves Martin

Utilizar mv -v para imprimir una línea por archivo movido y pv -l para imprimir 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 en cuenta que mv en la misma partición debe ser rápido. mv a otra partición sería lo mismo que cp source target seguido 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
lesmana

Invariablemente, termino buscando esta respuesta después Comienzo 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.

1
qazmonk

Utilizo el siguiente script guardado con rsmv name:

#!/usr/bin/env bash

rsync -aP --remove-source-files "[email protected]" && rm -rf "${@:1:$#-1}"

Maneja más de una fuente y nombres de archivos con espacios en blanco:

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel