De lo contrario, ¿hay alguna utilidad de línea de comando alternativa que pueda lograr esto?
De lo contrario, ¿hay alguna utilidad de línea de comando alternativa que pueda lograr esto?
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.
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)
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 strong>: 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
.
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.
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
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)
...
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.
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
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)
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
):
Vea qué tan grande es el archivo y recuerde
Comience a copiar
Abre otra terminal
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.
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?
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.
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% [===============================> ]
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").
Puedes copiar usar cualquier programa. Al mismo tiempo, puede iniciar sudo iotop
y ver la velocidad real de lectura / escritura del disco sin progreso.
Lea otras preguntas en las etiquetas command-line coreutils