¿Es posible ver la velocidad cp y el porcentaje copiado?

251

Tengo problemas al copiar archivos grandes usando nautilus (se atasca). Necesito copiar, usando cp. Me gustaría saber si hay algún parámetro que muestre el% copiado y también la velocidad de transferencia.

yzT
fuente
39
Podrías usar en rsynclugar de cp. Tiene una --progressopción.
frostschutz
2
Midnight Commandertambién funciona bien y tiene una interfaz de usuario bastante basada en texto con barras de progreso, pero podría no estar instalada. Pruebe mcen el símbolo del sistema. Además, obviamente, no lo es cp.
un CVn
3
Usar rsynccon --progresssolo me hizo descubrir lo que está sucediendo. Se atasca cuando alcanza el 100%, y luego dura un par de minutos. Creo que es lo mismo que está sucediendo con nautilus. De todos modos, esa es otra pregunta, por lo que la mejor respuesta para esta pregunta es rsync --progress: muestra el tamaño, el%, la velocidad y el tiempo transcurrido.
yzT
2
Un problema con rsync es que se ejecuta más lentamente que una copia pura. En mi gran servidor, la diferencia es de 60 MB / sy 300 MB / s, respectivamente.
pdwalker
1
@pdwalker incluso con la -Wopción? en todos mis hosts rsynces casi tan rápido como cp... tan cerca que uso regularmente en rsynclugar de cp.
Skaperen

Respuestas:

193

rsynctiene una bandera llamada progress2que muestra el porcentaje general:

rsync --info=progress2 source dest
yzT
fuente
55
--info = progress2 todavía no se ha convertido en un repositorio predeterminado y aquí está 2015. Parece una buena idea.
Lonniebiz
1
--info=progress2finalmente incluido en version 3.1.0 protocol version 31. Tal vez podrías editar tu respuesta, yzT.
Sopalajo de Arrierez
1
Me di cuenta de --info=progress2que rsync es increíblemente rápido. ¡200 MB / s, mientras que Windows no supera los 90 MB / s!
ReneFroger
1
@ReneFroger, aunque esa podría ser la velocidad real (dependiendo del dispositivo), a menudo en Linux esa velocidad rápida es realmente falsa, y después de que la copia ha finalizado, el sistema sigue escribiendo en el dispositivo, a diferencia de Windows, puede expulsar el dispositivo casi inmediatamente. Si copia archivos grandes, puede notar cómo comienza a esa velocidad rápida pero luego baja hasta el estándar.
yzT
77
funcionó para mí con solo --progress. rsync versión 3.0.9
adrianTNT
103

Si permite otras herramientas que cpseguramente es posible. Para un solo archivo que puede usar pv. Es una pequeña herramienta que proporciona buenas estadísticas.

pv inputfile > outputfile

Si tiene varios archivos o directorios, puede usar tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Puede envolverlo en una función de shell. Es menos para escribir y obtienes semántica cercana a las de cp. Aquí hay una función muy simple (¡y no a prueba de errores!):

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

Tenga en cuenta que algunas versiones de tarno admiten la sintaxis mencionada anteriormente (por ejemplo, Solaris tar) y debe usar la siguiente variante:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

Lo llamas así

cpstat sourceDirectory destinationDirectory

Puede mejorarlo aún más, de modo que pvproporcione una estimación del tiempo restante.

Otra solución (como menciona frostschutz en un comentario) es usar rsync con la --progressopción:

rsync --progress -a sourceDirectory destinationDirectory
Marco
fuente
1
cpstat va en el pastebin =)
Matt
77
Esto le dará velocidad de transferencia, pero no ETA, porque pvno sabe cuántos datos ingresarán a través de la tubería. Puede especificar esto usando -s. Por ejemplo, primero hacer du -sh sourceDirectorypara tener una idea (en bruto), y luego pasarlo a pv, como esto: pv -s 100m.
Jan Fabry
1
--info = progress2 le proporciona estadísticas de progreso a nivel de directorio.
AlexLordThorsen
vbuf(debian, ubuntu) es un poco más rápido que pv, probablemente debido a su búfer de anillo virtual
Skaperen
@Skaperen no lo sé vbuf. Pero como parece, en Debian es inestable en este momento y, por lo tanto, a menudo no está disponible en los servidores que generalmente ejecutan Debian estable.
Marco
58

rsync funciona mejor para mostrar el progreso durante el progreso de la copia.

ex:

rsync -avh --progress sourceDirectory destinationDirectory
JustStoppingThrough
fuente
27

Como se explica en otras respuestas, cp no proporciona esa funcionalidad. Sin embargo, el progreso (anteriormente llamado cv) es una pequeña herramienta que es muy útil para proporcionar esta característica que falta.

Esta herramienta se puede describir como un comando Tiny Dirty Linux Only * C que busca los comandos básicos de coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ...) que se ejecutan actualmente en su sistema y muestra el porcentaje de copias datos.

Lo he estado usando durante los últimos meses y es sólido.

Amr Mostafa
fuente
no parece funcionar con todos los sistemas de archivos (p. ej. cifs) pero +1, no conocía esas salidas locas
akostadinov
1
Tenga en cuenta que este proyecto ahora se llama "progreso - Coreutils Progress Viewer (anteriormente conocido como cv)".
chappjc
17

¿Es posible ver la velocidad cp y el porcentaje copiado?

Sí, es posible mostrar el progreso del comando cpen el terminal.


Método # 1: (uso progress)

Abra una nueva terminal y escriba progressque mostrará el progreso del cpcomando y otros comandos como:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

Si no lo ha instalado progress, puede instalarlo desde el repositorio, por ejemplo en el CentOScon este comando: yum -y install progress.

Luego, después de ejecutar el cpcomando en segundo plano, o después de ejecutar cpnormalmente, abra otra terminal, así que solo pruebe este comando:

# progress -m

Ver salida:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

Método # 2: (use parche cp)

O descargue el GNU coreutilsy parchelo.

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

Correr:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Copiar los dos archivos cpy mvloacated bajo coreutils-8.21/src/a /usr/local/bin:

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

O cópielo usando su administrador de archivos como root

Agregue las siguientes líneas a su ~/.bashrc:

alias cp='cp -gR'
alias mv='mv -g'

Cerrar sesión e iniciar sesión

La barra de progreso se puede mostrar sin el –go –progress-barsegún lo recomendado por el autor

Ver salida:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

Fuente: linuxhelp

GAD3R
fuente
1
Esta parece ser la verdadera fuente del cpparche: web.archive.org/web/20131115171331/http://beatex.org/web/…
Kaushal Modi
1
+1 para la pista sobre el progresscomando
Peter
esta es la única respuesta real
Alessio
14

Noté que esta publicación era algo vieja. Pero cuando hice una solución al problema en cuestión, pensé en publicar mi solución.

Escenario: tenemos una estructura de directorios muy grande que queremos copiar, por lo que emitimos el comando cp -R sourcedir destdir en una ventana de terminal.

Abra otra ventana de terminal o empuje el proceso a un segundo plano (Ctrl+Z,bg<CR>), luego hagamos un indicador de progreso de la manera ghetto:

Primero obtenemos el tamaño total de la estructura de directorios que queremos copiar, lo hace con:

du -sh /path/sourcedirectory/

Convierta el resultado a gigabytes (G), luego sustituya el resultado por n en el tamaño de fuente variable. Una vez que haya insertado el tamaño de fuente y el destdir (directorio de destino), ejecute el siguiente comando.

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

Esto imprimirá el progreso cada 10 segundos con mensajes como:

0.100% completed
0.200% completed
0.300% completed 
... etc

Soy consciente de que esta solución no abordó la velocidad de copia, pero sería posible agregar eso expandiendo los comandos anteriores, posiblemente convirtiéndolo en un script bash para que sea más fácil de leer. Por ejemplo, comprobando cuántos datos se copian pr. n unidad de tiempo, la velocidad debe ser trivial para calcular y mostrar.

NordicViking
fuente
Esto es realmente perfecto para mi caso de uso, así que gracias por publicarlo. Quiero saber sobre el progreso de copiar un gran directorio con miles de archivos, no solo un archivo, por lo que las otras soluciones realmente no me ayudan.
Ibrahim
Esto es genial, especialmente en casos como el que estoy experimentando ahora: de forma remota, comencé un gran trabajo de MV para mover terrabytes de copias de seguridad de un grupo de almacenamiento a otro, sin pensar en las implicaciones de antemano. Ahora puedo fácilmente poner en segundo plano el proceso y echarle un vistazo. ¡Increíble!
Riley
8

Para mejorar la respuesta de Marco, hoy escribí esta versión de cpstat, para que pueda copiar muchos directorios y usar el último parámetro como la ruta de destino. Tenga en cuenta que si usa una ruta profunda relativa como fuente, puede, gracias a tar, crear automáticamente el mismo árbol de directorios dependiente.

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}
poe84it
fuente
6

No en una versión estándar de cp.

Puede poner en segundo plano el cp y enumerar el tamaño mientras espera a cpque termine.

Uso este perl para monitorear el crecimiento de un solo archivo pero se ejecuta externamente al cp (o lo que sea que esté haciendo)

Mate
fuente
5

Aunque rsyncle dará algunas estadísticas de progreso, si desea una barra de progreso, debe usarla pv.

Puede usar cpvun contenedor para pvuna sintaxis más fácil, más similar a la cpque puede usar para copiar directorios de forma recursiva

ingrese la descripción de la imagen aquí

Puedes conseguirlo aquí

nachoparker
fuente
+1 para la pista pv. Buen hallazgo!
Peter
4

Usar una herramienta como mc(comandante de medianoche) puede ser una buena opción alternativa a otras respuestas.

Es un administrador de archivos simple que muestra el progreso de copiar / mover.

jseals
fuente
4

dd status=progress

Opción agregada 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

Vea también: ¿Cómo monitorea el progreso de dd? El | Pregúntale a Ubuntu

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
4

Otra solución simple es simplemente mirar la carpeta de salida de la siguiente manera:

Linux / Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

Esta práctica utilidad se ejecutará duy resaltará las diferencias.

Otra solución potencial sería escribir una secuencia de comandos simple que repita, llamando duy escupiendo una estimación aproximada del rendimiento.

Timothy C. Quinn
fuente
3

Esta herramienta es un comando de utilidad de Linux que busca los comandos básicos de coreutils (cp, mv, dd, tar, gzip / gunzip, cat, etc.) que se ejecutan actualmente en su sistema y muestra el porcentaje de datos copiados:

https://github.com/Xfennec/cv

saidi
fuente
1
Esto ya fue sugerido por @AmrMostafa en noviembre del '14.
Dubu
2

Acabo de tener un caso en el que cp estaba más o menos bloqueado debido a un error FUSE en el sistema de archivos receptor.

Si no puede simplemente cambiar de cp (es decir, porque --sparse = siempre) y quiere algo que sea realmente confiable para el progreso, vaya a través de / proc.

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0
Florian Heigl
fuente
0

VCP: copie archivos en una interfaz de maldiciones (Mostrar la barra de progreso en Linux).

DESCRIPCIÓN: vcp copia archivos y directorios en una interfaz de maldiciones, con salida de texto solo disponible. sus opciones y resultados son similares a los del cp de BSD al tiempo que agrega algunas características nuevas.

Proporciona información sobre:

  • archivos copiados y dejados para copiar
  • datos escritos y tamaño total de datos
  • datos que se escriben cada segundo
  • dos barras de estado, una que muestra el estado actual del archivo, la otra estado total (excepto con 1 archivo, ambos muestran actual) y porcentaje

cuando la salida se envía a la consola:

  • una barra de estado
  • tamaño copiado y velocidad

Página de manual de VCP: https://linux.die.net/man/1/vcp

Descargue vcp-2.2.tar.gz desde:

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

Dependencia: curses.h (libncurses-dev).

En Ubuntu, instale:

sudo apt-get install libncurses-dev

o

sudo apt-get install libncurses5-dev

INSTALE vcp:

make && make install

Manual:

man vcp
user350351
fuente