¿Cómo mostrar el progreso y la velocidad de la transferencia al copiar archivos con cp?

274

De lo contrario, ¿hay alguna utilidad de línea de comando alternativa que pueda lograr esto?

    
pregunta Olivier Lalonde 14.12.2010 - 05:48

15 respuestas

204

Si bien cp no tiene esta funcionalidad, puedes usar pv para hacer esto:

pv my_big_file > backup/my_big_file

Nota: este método perderá los permisos y la propiedad del archivo. Los archivos copiados de esta manera tendrán los mismos permisos que si los hubiera creado usted mismo y le pertenecerán a usted.

En este ejemplo, pv básicamente solo emite el archivo a stdout *, que redirige a un archivo utilizando el operador > . Simultáneamente, imprime información sobre el progreso en el terminal cuando lo hace.

Así es como se ve:

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

Es posible que necesite Instalar pv (alternativamente, escriba sudo apt-get install pv ) en su sistema.

*: El bit técnico

Hay tres flujos de datos importantes en un sistema tipo Unix: stdout (salida estándar), stderr (error estándar) y stdin (entrada estándar). Cada programa tiene los tres, por así decirlo. El operador de redirección > redirige la salida del programa a un archivo. Sin argumentos, como se ve arriba, > redirige la salida estándar de un programa a un archivo. cp básicamente no hace nada más elegante que

cat source > destination

(donde cat solo lee un archivo y lo imprime en stdout). pv es como cat, pero si redirige su flujo de salida a otro lugar, imprimirá la información de progreso en stdout en su lugar.

Eche un vistazo a man pv para obtener más información al respecto.

Otra opción, como DoR sugiere en esta respuesta , es usar rsync en su lugar:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

Esto conservará los permisos / propiedad de los archivos mientras muestra el progreso.

    
respondido por el Stefano Palazzo 14.12.2010 - 06:17
130

No hay. Consulte aquí sobre por qué. Aunque hace más de lo que necesita, rsync tiene uno con el parámetro --progress . La -a mantendrá permisos, etc., y -h será legible para el ser humano.

rsync -ah --progress source destination

La salida se verá más o menos así:

Pictures/1.jpg
      2.13M 100%    2.28MB/s    0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
      1.68M 100%    1.76MB/s    0:00:00 (xfr#5899, to-chk=0/5905)
    
respondido por el bartekbrak 15.10.2012 - 10:06
84

Si quiere ver si sus archivos se están transfiriendo correctamente, puede usar gcp y gcp como cp, pero de manera predeterminada le da una barra de progreso para que pueda ver lo que se está copiando. Como las notas de la wiki del programa , gcp tiene varias funciones útiles, como

  
  • indicación de progresión de transferencia
  •   
  • copia continua por error (salte al siguiente archivo)
  •   
  • registro de estado de copia: gcp registra todas sus acciones para que sea posible saber qué archivos se han copiado correctamente
  •   
  • cambio de nombre para manejar las limitaciones del sistema de archivos de destino (por ejemplo, eliminación de caracteres incompatibles "*" o "?" en FAT)
  •   

Sin embargo, incluso cuando la barra de progreso haya alcanzado el 100% al usar la herramienta, debe esperar hasta que reaparezca el mensaje de la terminal antes de eliminar su medio de manera segura para asegurarse de que el proceso de transferencia haya finalizado exitosamente.

gcp se usa para copiar archivos y tiene opciones tales como --preserve para que varios atributos y permisos puedan conservarse y --recursive para que se puedan copiar directorios enteros. Para obtener más información sobre sus opciones, ingrese man gcp o vaya a las páginas de manual de Ubuntu. en línea . También hay un tutorial disponible en este sitio .

Instalar gcp desde los repositorios con

sudo apt-get install gcp

( Nota : en Ubuntu 12.10 el nuevo punto automount es, por ejemplo, /media/user/usbdisk )

Puede copiar un archivo en su medio ingresando

gcp /home/mike/file.mp4 /media/usb

y copie una carpeta a su medio con

gcp -rv ~/Podcasts /media/Mik2

Salida de muestra de gcp con la barra de progreso:

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

Por supuesto, puede especificar múltiples archivos o carpetas para copiar a su disco, y hay muchas otras opciones cubiertas en man gcp .

    
respondido por el user76204 15.10.2012 - 13:09
54

Me gusta usar cURL para este propósito exacto. La página man enumera el protocolo "FILE" como compatible, así que simplemente úselo como cualquier otro protocolo en una URL:

curl -o destination FILE://source

Velocidad, progreso, tiempo restante y más, todo en un formato familiar.

    
respondido por el mathemagician 02.02.2013 - 10:00
22

Si bien no muestra velocidad, al copiar varios archivos, la opción -v del comando cp le proporcionará información de progreso. por ejemplo,

cp -rv old-directory new-directory
    
respondido por el Ubuntourist 14.12.2010 - 18:17
19

El kernel conoce la mayoría de los datos, como la velocidad y, a menudo, también el porcentaje. Los núcleos modernos exponen esto a través de su sistema de archivos / proc.

velocidad de apertura de enlace usa esa información. Se puede conectar a programas que ya se están ejecutando y dar actualizaciones periódicas como esta:

$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB)  9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB)  8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB)  8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB)  7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB)  7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB)  7m:18
p/4417/fd/1w /tmp/otherbigfile  67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...
    
respondido por el Jürgen Weigert 25.02.2014 - 15:34
11

Mientras que pv puede tratar tareas locales cp , usar dd con pv puede ocuparse de tareas locales ( cp ) y remotas ( scp ).

dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

Asegúrate de que path/to/dest.mkv sale por touch path/to/dest.mkv

Esto puede mostrar el progreso, pero si quieres la información de porcentaje,

dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

Reemplaza el 100M anterior con el tamaño real de tu archivo fuente.

Aquí viene la parte remota

Mientras que scp apenas puede mostrar el progreso actual, usar dd con pv es pan comido.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
    

respondido por el onemach 05.01.2013 - 09:08
10

Hay una nueva herramienta llamada cv que puede encontrar cualquier descriptor relacionado con un comando en ejecución y mostrar el progreso y la velocidad: enlace

cv -w

muestra las estadísticas de todas las operaciones cp, mv, etc. ejecutadas

    
respondido por el naugtur 13.07.2014 - 13:33
10

Hay una herramienta llamada progress en los repositorios que puede examinar varios comandos diferentes y mostrar información de progreso para ellos.

Instálelo usando el comando

sudo apt-get install progress

Esta herramienta se puede usar así:

cp bigfile newfile & progress -mp $!

Salida:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)
    
respondido por el Nathaniel A Malinowski 27.09.2016 - 00:35
6

Como muchos dijeron, cp no incluye esta funcionalidad.

Solo para arrojar mi $ 0.02, lo que suelo hacer con situaciones de copia triviales (es decir, no -R ):

  1. Vea qué tan grande es el archivo y recuerde

  2. Comience a copiar

  3. Abre otra terminal

  4. Ejecute watch ls -lh DIR en el directorio donde el destino es

Esto puede mantenerme actualizado sobre el tamaño del archivo de destino, con bastante molestia mínima.

Como alternativa para situaciones menos triviales, p. recursivamente copiando directorios, puede usar watch du -hs DIR para ver el resumen del tamaño de DIR. Sin embargo, du puede tomar mucho tiempo para calcular e incluso puede ralentizar la copia, por lo que es posible que desee utilizar el argumento -n INTERVAL para verlo, de modo que la transacción sea aceptable.

Actualización: en caso de que use comodines con el comando utilizado con watch du, p. watch du -hs backup/* , no olvides citar:

watch "du -hs backup/*"

de lo contrario, las comodines se expandirán solo una vez , cuando watch started para que du no vea nuevos archivos / subdirectorios.

    
respondido por el Alois Mahdal 16.11.2012 - 14:20
4

dd status=progress

Opción añadida en GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Stdout es una línea actualizada periódicamente como:

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

Ver también: ¿Cómo se supervisa el progreso de dd?

    
3

Dependiendo de lo que quieras hacer, Midnight Commander ( mc ) podría ser la respuesta. Me sorprende que aún no se haya mencionado.

Herramientas como pv o rsync son buenas para mostrar el progreso de la transferencia de un archivo enorme, pero cuando se trata de copiar directorios / árboles completos, mc calcula el tamaño y luego muestra el progreso muy bien. Además, está disponible de fábrica en la mayoría de los sistemas.

    
respondido por el kralyk 30.01.2016 - 18:33
2

Usar un script de shell:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "" "" 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' "") count=0
}

Esto se verá así:

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

Fuente

    
respondido por el Jan 01.09.2014 - 15:45
2

Si tiene rsync 3.1 o superior ( rsync --version ), puede copiar (cp -Rpn) conservando los permisos y la propiedad, los directorios recurse, "no clobber", y mostrar el progreso general (en lugar de simplemente avanzar por archivo) , velocidad de copia y (muy aproximado) tiempo restante estimado con:

sudo rsync -a --info=progress2 --no-i-r /source /destination

Tenga en cuenta que sudo solo es necesario si se trata de directorios / archivos de los que no es propietario. Además, sin --no-i-r , el porcentaje puede restablecerse a un número menor en algún momento durante la copia. Quizás las versiones posteriores de rsync tendrán como valor predeterminado no-i-r con info = progress2, pero no en la versión actual de 3.1.2.

Descubrí que el porcentaje y el tiempo restante están excesivamente sobreestimados al copiar en un directorio que ya contiene archivos (es decir, cuando normalmente se usa cp -n "no clobber").

    
respondido por el S Lentz 02.03.2016 - 23:22
0

Puedes copiar usar cualquier programa. Al mismo tiempo, puede iniciar sudo iotop y ver la velocidad real de lectura / escritura del disco sin progreso.

    
respondido por el McKelvin 11.01.2018 - 16:47

Lea otras preguntas en las etiquetas