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

326

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

Olivier Lalonde
fuente

Respuestas:

249

Si bien cpno tiene esta funcionalidad, puede usar pvpara 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 pertenecieran.

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

Esto es lo que parece:

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 importantes de datos 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 puede ver arriba, >redirige la salida estándar de un programa a un archivo. cpbásicamente no hace nada más elegante que

cat source > destination

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

Echa un vistazo man pvpara obtener más información al respecto.


Otra opción, como sugiere texto alternativoDoR 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 preservará los permisos / propiedad de los archivos mientras muestra el progreso.

Stefano Palazzo
fuente
3
Puede o no ser significativo (dependiendo de la situación), pero pvno maneja los permisos de la misma manera que lo cphace ... (basado en una prueba rápida que probé: pvno copié el bit de ejecución en ... rsyncsí.
Peter .O
45
OMI: alias cp="rsync -avz"cp está desactualizado.
Marco Ceppi
11
Si eres como yo y te olvidas pv, puedes ir a espiar /proc/PID of cp/fdy /proc/PID of cp/fdinfodescubrir el progreso. (Depende de usted inferir velocidad). Utilizo esta técnica para mirar updatedb.
Thanatos
11
Sí, -zprobablemente solo debería usarse para copias de red; comprimir y descomprimir los datos para una copia local es pura sobrecarga.
Matthew leyó el
3
@MarcoCeppi, cuando copie el directorio rsyncasegúrese de no agregar el final /a la ruta de origen (o eliminar si, por ejemplo, la finalización de bash lo coloca allí automáticamente). De lo contrario, obtendrá resultados diferentes que cuando usa cp(o gcp).
Piotr Findeisen
185

No hay Vea aquí por qué. Aunque hace más de lo que necesita, rsynctiene un --progressparámetro. El -amantendrá permisos, etc., y -hserá legible por humanos.

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)
bartekbrak
fuente
44
Esto funciona muy bien en el Ubuntu actual (14.10). También es compatible con la -rbandera de directorios recurrentes. Incluso puede ser alias como un reemplazo directo para cp:alias cp="rsync -ah --progress"
rustyx
1
Las obras funcionan bien en OS X, con la ventaja de poder usar las herramientas incluidas con el sistema.
Ivan X
3
Me gusta esta alternativa mejor que pv, especialmente porque rsync es parte de la instalación estándar
Joao Costa
1
@bartekbrak gracias por compartir. Actualmente estoy en macOS 10.12.x ejecutando la versión homebrew de rsync 3.1.2 y el uso --progresshace que mi cabeza gire 🙃 mirando toda la pantalla de salida en el terminal. Entonces, aquellos que vienen aquí de búsquedas de palabras clave de AOL, rsync -ah --info=progress2 [source] [destination] presentan el resultado de una manera un poco más sensata 👩‍⚕️ en mi humilde opinión.
ipatch
2
Desafortunadamente, el resultado no es muy útil al copiar muchos archivos pequeños.
Raphael
89

Si desea ver si sus archivos se están transfiriendo correctamente, puede usar gcpy gcpes como cp, pero por defecto le da una barra de progreso para que pueda ver lo que se está copiando. Como señala la wiki del programa , gcptiene varias características útiles como

  • indicación de progresión de transferencia
  • copia continua en caso de error (pase al siguiente archivo)
  • copia del registro del estado: 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 vuelva a aparecer el indicador de terminal antes de quitar sus medios de manera segura para asegurarse de que el proceso de transferencia haya finalizado con éxito.

gcpse usa para copiar archivos y tiene opciones tales como --preservepara que se puedan preservar varios atributos y permisos y --recursivepara que se puedan copiar directorios completos. Puede encontrar más información sobre sus opciones ingresando man gcpo visitando las páginas de manual de Ubuntu en línea . Un tutorial también está disponible en este sitio .

Instalar gcpdesde los repositorios con

sudo apt-get install gcp

( Nota : en Ubuntu 12.10, el nuevo punto de montaje automático es, por ejemplo /media/user/usbdisk)

Puede copiar un archivo a su medio ingresando

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

y copie una carpeta a sus medios con

gcp -rv ~/Podcasts /media/Mik2

Salida de muestra gcpcon 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 en su disco, y hay muchas otras opciones cubiertas man gcp.


fuente
44
Recibí un error con sshdbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
msa7
3
Si tiene una pantalla X11 abierta en la máquina, puede configurarla export DISPLAY=:0.0antes de iniciar gcp. Si la máquina no tiene cabeza, entonces tendría que iniciar una sesión x en un framebuffer virtual o algo así, en ese momento probablemente debería buscar otro programa
user292067
2
gcpes bastante decente pero el requisito de DBUS / X es extraño. Manejé esto sobre SSH usando el reenvío ssh: ssh -X user@hosty eso me permitió ejecutarlo.
Oli
68

Me encanta usar cURL para este propósito exacto. La página de manual enumera el protocolo "ARCHIVO" como compatible, así que ú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.

matemático
fuente
1
Esto es excelente, especialmente en entornos donde se le prohíbe instalar nuevas herramientas y donde rsync no está disponible.
55
¡Brillante, este tiene que ser un truco imprescindible!
ionreflex
¡Buena respuesta! ¡Inteligente!
9301293
Se supone que esto tiene el mismo inconveniente como pv, que no va a salvar permisos.
Ploni
1
¡Dulce! alguna forma de hacer que esto funcione para un directorio?
Joseph Rajeev Motha
28

Si bien no muestra la velocidad, al copiar varios archivos, la -vopción del cpcomando le proporcionará información de progreso. p.ej

cp -rv old-directory new-directory
Ubuntourist
fuente
10
Información de progreso? Esto es solo una salida detallada. Para proporcionar información sobre el progreso, al menos necesitará saber cuántos archivos, o incluso qué archivos, se deben copiar.
Julian F. Weinert
Muestra en qué archivo está, lo que puede ser suficiente en casos menos exigentes.
Gringo Suave
20

El núcleo 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.

showpeed de https://github.com/jnweiger/showspeed usa esa información. Se puede adjuntar a programas que ya se están ejecutando y proporcionar 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)
...
Jürgen Weigert
fuente
Buena esa. Sin embargo, ¿cómo funciona los porcentajes? ¿Supongo que solo en el caso de archivos abiertos como solo lectura? Y probablemente no funcionará en caso de acceso disperso.
j_kubik
1
En este caso, también puede usar otro terminal para ejecutar pkill -USR1 ddpara ddmostrar su estado, otra opción sería watch -n 1 pkill -USR1 ddhacer que muestre su progreso periódicamente (cada segundo).
Yaron
Derecha. Muchas herramientas tienen una forma integrada de informar estadísticas a lo largo del tiempo. dd no es la excepción. Las implementaciones modernas tienen una opción status = progess. Showspeed es una solución clásica de "una herramienta para un propósito" de estilo unix, al igual que pv. Pero tiene diferentes casos de uso: piense en tazas que bombean un archivo a través de ghostscript o desea conocer el ETA para un cp o tar en curso. Es posible que ya esté hecho al 95% después de unas pocas horas y probablemente no desee reiniciar eso solo para agregar pv ... El acceso disperso no funcionaría bien. La velocidad de muestra solo muestra las posiciones de búsqueda.
Jürgen Weigert
18

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

Instálalo 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)
Nathaniel A Malinowski
fuente
12

Si bien pvpuede ocuparse de cptareas locales , el uso ddde pvpuede ocuparse tanto de tareas locales ( cp) como remotas ( scp).

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

Por favor, asegúrese de las path/to/dest.mkvsalidas portouch path/to/dest.mkv

Esto puede mostrar el progreso, pero si desea la información del porcentaje,

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

Reemplace 100Marriba con el tamaño real de su archivo fuente.

Aquí viene la parte remota

Mientras que scpdifícilmente puede mostrar el progreso actual, utilizando ddcon pves un pedazo de pastel.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
onemach
fuente
1
Más reciente ddtiene status=progress: askubuntu.com/a/824895/52975
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
11

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: https://github.com/Xfennec/cv

cv -w

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

naugtur
fuente
watch cv -qes aún más
ordenado
Solo muestra el progreso de un archivo individual, se da cuenta de si cpestá copiando un directorio de forma recursiva o no.
Flimm
1
Se renombró la guerra al progreso. Gran herramienta!
sebastian
7

Como muchos dijeron, cp no incluye esta funcionalidad.

Solo para arrojar mis $ 0.02, lo que generalmente hago 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. Ejecutar watch ls -lh DIRen el directorio donde está el objetivo

Esto me puede mantener actualizado sobre el tamaño del archivo de destino, con una molestia mínima.

Como alternativa para situaciones menos triviales, por ejemplo, copiando directorios de forma recursiva, puede usar watch du -hs DIRpara ver un 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 un -n INTERVALargumento para observar para que la compensación sea aceptable.

Actualización: en caso de que utilice comodines con el comando utilizado con watch du, por ejemplo watch du -hs backup/*, no olvide citar:

watch "du -hs backup/*"

de lo contrario, los comodines se expandirán solo una vez , cuando se inicie la observación, por lo que no mirará nuevos archivos / subdirectorios.

Alois Mahdal
fuente
Sin embargo, no responde la parte de "velocidad" ...
Alois Mahdal
7

dd status=progress

Opción agregada en GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

El terminal muestra una línea de tipo:

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

Vea también: ¿Cómo monitorea el progreso de dd?

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
1
Querías decir: stdout es una secuencia de caracteres y secuencias de escape vt100 que hacen que tu terminal muestre una línea actualizada periódicamente;). stdout siempre es un flujo de bytes y no tiene nada que ver con cómo se muestra (excepto que la aplicación puede saber si está actualmente conectado a un terminal o no ...)
masterxilo
@masterxilo newbs no les importará, los expertos lo sabrán ;-) jeje
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Bueno, creo que siempre es bueno decir las cosas como son, tal vez omitiendo algunos detalles, pero nunca hagas que tus lectores produzcan un modelo mental equivocado. Si dice "stdout es una línea (actualizada periódicamente)" parece que está diciendo que stdout es un bloque de memoria mutable que no lo es. Es importante saberlo incluso para los novatos.
masterxilo
6

Si tiene rsync 3.1 o superior ( rsync --version), puede copiar (cp -Rpn) mientras conserva los permisos y la propiedad, los directorios recurrentes, "no clobber" y muestra el progreso general (en lugar de solo el progreso por archivo), la velocidad de copia y ( muy aproximado) tiempo estimado restante 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 que no son de su propiedad. Además, sin el --no-i-r, el porcentaje puede restablecerse a un número inferior en algún momento durante la copia. Tal vez las versiones posteriores de rsync estarán predeterminadas en no-ir con info = progress2, pero no en la versión actual de 3.1.2.

Descubrí que el porcentaje y el tiempo restante se sobrestiman enormemente al copiar en un directorio que ya contiene archivos (es decir, como cuando normalmente usaría cp -n "no clobber").

S Lentz
fuente
3

Use un script de shell:

#!/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% [===============================>                      ]

Fuente

ene
fuente
3

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

Las herramientas les gusta pvo rsyncson buenas para mostrar el progreso de la transferencia de un archivo enorme, pero cuando se trata de copiar directorios / árboles completos, mccalcula el tamaño y luego muestra el progreso muy bien. Además, está disponible de fábrica en la mayoría de los sistemas.

kralyk
fuente
2
"Está disponible de fábrica en la mayoría de los sistemas". ... no en ninguna instalación predeterminada de Ubuntu.
Muru
1

podría ser una opción más para preservar los atributos (si sourcees una carpeta en la que se creará destination)

tar -c source | pv -e -t -p -r | tar -C destination  -x

Espero que pueda ser útil para alguien. Para tener un tiempo de transferencia estimado, esto se puede lograr haciendo do -s sourcede antemano y pasándolo como un -s <size>parámetro a pv.

ciekawy
fuente
-f -Es redundante. tarLa salida predeterminada cy la entrada para xson stdout y stdin.
muru
¿Puede depender de la versión del sistema operativo / tar? Sé que es un sitio de Ubuntu sin embargo, esto puede ser útil para otros propietarios de OS como macOS
ciekawy
1
No. Todas las implementaciones sensatas (incluido el tar de libarchive, que usa macOS) tienen este comportamiento.
muru
acaba de verificar en macos y su sugerencia es perfectamente válida. He actualizado mi respuesta. ¡Gracias!
ciekawy
0

Puede copiar usar cualquier programa. Al mismo tiempo, puede iniciar sudo iotopy ver la velocidad de lectura / escritura del disco sin progreso.

McKelvin
fuente
0

Verifique el código fuente de progress_bar en el repositorio de git a continuación

https://github.com/Kiran-Bose/supreme

Prueba también el paquete de script bash personalizado supremo

Descargue el archivo deb e instálelo en una distribución basada en debian o descargue los archivos fuente, modifíquelos y utilícelos para otras distribuciones

Resumen de funcionalidad

(1) Aplicaciones abiertas ---- Firefox ---- Calculadora ---- Configuración

(2) Administrar archivos ---- Buscar ---- Navegar ---- Acceso rápido

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Administrar teléfono ---- Mover / Copiar desde teléfono ---- Mover / Copiar a teléfono ---- Sincronizar carpetas

(4) Administrar USB ---- Mover / Copiar desde USB ---- Mover / Copiar a USB

KIRAN B
fuente
0

pv sabe cómo ver los descriptores de archivos dados un pid, ya sea cp u otra cosa

De la documentación:

   (Linux only): Watching file descriptor 3 opened by another process 1234:

          pv -d 1234:3

   (Linux only): Watching all file descriptors used by process 1234:

          pv -d 1234

Ejemplo:

md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============>                                 ] 29% ETA 0:00:53

$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov:  754MiB 0:00:04 [97,2MiB/s] [======================>                       ] 52% ETA 0:00:07
4:/media/windows/copy.mov:  754MiB 0:00:04 [97,3MiB/s] [     <=>                                                                   ] 
alecail
fuente