Al mover directorios grandes usando mv
, ¿hay alguna forma de ver el progreso (%)? El cp
comando en gentoo tenía un -g
interruptor que mostraba el progreso.
Al mover directorios grandes usando mv
, ¿hay alguna forma de ver el progreso (%)? El cp
comando en gentoo tenía un -g
interruptor que mostraba el progreso.
Respuestas:
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 usas mv normalmente.
También puede hacerlo alias mvg="/usr/local/mvg -g"
, solo necesita decir mvg bigfile /mnt/backup
y obtener directamente la barra de progreso.
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
interruptor 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
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 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.
bar
no se envuelve mv
todavía.
rsync
no 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
.
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
progress
después de la instalación y me presentó el progreso del mv
comando que estaba esperando actualmente. ¡Gracias!
sudo
(el mismo usuario, supongo). También puedes usar watch
para decir lo que sucede cada 2 segundos:watch progress -w
watch progress -w
usted también puede simplemente usarprogress -m
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 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 cp
hace. Sin embargo, copiar no pv
es 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 .bashrc
si 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-dir
le dará el rendimiento de un directorio completo. Si conoce el tamaño y pasa -s
a pv, también puede darle progreso.
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.
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 $src
no no terminar en una barra invertida, de lo contrario obtendrá un significado diferente que el de GNU cp
.
Se rm -r
necesita al final 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
, comofind $src -d -exec rmdir {} +
La única falla es que la -P
opció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=progress2
que muestra el progreso de toda la operación.
Para evitar parches de Coreutil para agregar una barra de progreso mv
y cp
, gcp
(Goffi's CoPier) es una nueva alternativa: http://wiki.goffi.org/wiki/Gcp/en
Usar de la misma manera que cp
con las opciones -r
de recursividad y -v
de 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/
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 -sm
en 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 df
y veo cuánto de los archivos se copiaron.
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
en un buen formato legible es:
curl -o DESTINATION FILE://source
Además, es posible que deba instalarlo primero sudo apt-get install curl
gcp
no admite el movimiento del archivo, es decir, los archivos de origen deben eliminarse manualmente después de una copia exitosa.
Esto no le da una barra de progreso, pero presione CTRL-T
y enviará un correo electrónico 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%
INFO: unknown signal; killall -l lists signals.
creo que SIGINFO solo está en algunos BSD, no en POSIX estándar.
Utilícelo mv -v
para imprimir una línea por archivo movido e pv -l
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 mv
en cuenta que en la misma partición debe ser rápido. mv
a otra partición sería lo mismo 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
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.