martes, 7 de abril de 2009

Cómo mostrar una barra de progreso al copiar o mover (cp/mv) ficheros en linux

Esta mañana, haciendo limpieza de mi cuenta, me he encontrado con algo curioso de linux, en particular de debian y linux: los comandos cp y mv no tienen ningún parámetro que permita saber qué porcentaje de la copia se ha hecho y cuánto tiempo queda (más o menos) hasta el final de la copia. Generalmente, esto no tiene mucha importancia, porque una copia de un fichero pequeño tarda del orden los milisegundos, pero si tenemos que copiar ficheros de varios gigabytes, el problema que tenemos es que no recibimos ninguna señal de que el comando se ejecuta correctamente hasta que éste acaba.

Buscando un poco por internet, he descubierto que en otras distribuciones como Gentoo existen parámetros ('-g' o '--prog') que permiten añadir una barra de progreso a los comandos de copiar y mover ficheros. Debian y Ubuntu, por el contrario, han decidido que una barra de progreso no es necesaria, y que siempre se puede usar rsync en los casos en los que se quiera una barra o indicación de progreso.

Lo que me he encontrado buscando, es una solución más elegante, consistente en usar "pv" (pipe viewer). pv permite monitorizar el paso de un fichero a través de una pipe entre dos procesos, para dar una indicación visual de cuánto tardará en acabarse la transferencia o a qué velocidad se produce. Puedes encontrar pv en los repositorios de las distribuciones de linux más importantes. (en debian/ubuntu, lo podrás instalar ejecutando "apt-get install pv"; en Fedora, ejecutando "yum install pv").

Usando el comando pv, es fácil implementar un script que implemente un copy (cp) o un move (mv) con una barra de progreso y algunos datos sobre el tiempo restante de copia o la velocidad de transferencia.

Por ejemplo, en vez del típico "cp origen destino", se podría hacer usando pv de la siguiente manera:
$ pv a > b;
882MB 0:00:01 [ 465MB/s] [============>] 100%

Podríamos usar eso para crear dos nuevos comandos, pcp y pmv, que sustituyesen a cp y mv. Por ejemplo:
pcp()
{
pv "$1" > "$2"
}

pmv()
{
pv "$1" > "$2";
rm "$1"
}

Un par de consideraciones importantes:
  1. Esos scripts solo copiarían fichero simple indicando nombre de origen y destino. No se podría usar más de un fichero origen, y como destino no se podría indicar un directorio.
  2. El mv se implementaría con un copiar y borrar, con lo que se convierte en una operación bastante más costosa que el mv simple de linux. Personalmente, no veo tan útil usar una barra de progreso para una operación que dura tan poco.

3 comentarios:

  1. Hola gracias por la explicación y la verdad creo que es útil la barra de progreso para evitar la sensación de cuelgue en la maquina yo la e apagado creyendo que se colgo y cuando se va apagando empieza a copiar, parece inútil pero no lo es.

    ResponderEliminar
  2. Creo que los desarrolladores deberían incorporar la nueva funcionalidad. En mi caso copiar varios Gb de archivos de un SO dañado seria muy útil.

    ResponderEliminar
  3. Excelente aporte!!!, ver el progreso de la operación en curso me permite saber de antemano cuanto tiempo le debo prestar atención a la computadora antes de hacer otra cosa.

    ResponderEliminar

Puedes utilizar algunos códigos HTML, como <b>, <i>, <a>