Come mostrare l'avanzamento e la velocità del trasferimento durante la copia di file con cp?


Risposte:


249

Sebbene cpnon abbia questa funzionalità, puoi usare pvper fare questo:

pv my_big_file > backup/my_big_file

Nota: questo metodo perderà le autorizzazioni e la proprietà del file. I file copiati in questo modo avranno le stesse autorizzazioni di se li avessi creati tu e appartenessero a te.

In questo esempio, pvfondamentalmente restituisce semplicemente il file a stdout *, che reindirizza a un file utilizzando l' >operatore. Allo stesso tempo, stampa le informazioni sullo stato di avanzamento sul terminale quando lo fai.

Ecco come appare:

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

Potrebbe essere necessario  installare pv (in alternativa, digitare sudo apt-get install pv) sul proprio sistema.


*: Il bit tecnico

Esistono tre importanti flussi di dati in un sistema simile a unix: stdout (output standard), stderr (errore standard) e stdin (input standard). Ogni programma ha tutti e tre, per così dire. L' >operatore di reindirizzamento reindirizza l'output del programma su un file. Senza argomenti, come vedi sopra, >reindirizza l' output standard di un programma su un file. cppraticamente non fa niente di più fantasioso di

cat source > destination

(dove catlegge solo un file e lo stampa su stdout). pvè come cat, ma se reindirizzi il flusso di output da qualche altra parte, stamperà invece le informazioni sull'avanzamento su stdout.

Dai un'occhiata man pvper saperne di più.


Un'altra opzione, come suggerisce testo alternativoDoR in questa risposta , è invece usare rsync:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

Ciò conserverà i permessi / proprietà dei file mentre mostrerà i progressi.


3
Si può o non può essere significativo (a seconda della situazione), ma pvnon gestisce i permessi allo stesso modo di cpfa ... (sulla base di un test rapido ho provato: pvha non copia il bit di esecuzione attraverso .. rsync. Ha fatto
Peter .O

45
IMO: alias cp="rsync -avz"cp è obsoleto.
Marco Ceppi

11
Se sei come me e ti dimentichi pv, puoi andare a curiosare /proc/PID of cp/fde /proc/PID of cp/fdinfocapire i progressi. (Sta a te inferire la velocità.) Uso questa tecnica per guardare updatedb.
Thanatos, il

11
Sì, -zprobabilmente dovrebbe essere usato solo per copie di rete; comprimere e decomprimere i dati per una copia locale è puro sovraccarico.
Matteo Leggi il

3
@MarcoCeppi, quando si copia la directory, rsyncassicurarsi di non aggiungere il trailing /al percorso di origine (o rimuovere, ad esempio, se il completamento bash lo inserisce automaticamente). Altrimenti otterrai risultati diversi rispetto a quando usi cp(o gcp).
Piotr Findeisen,

185

Non c'è. Vedi qui perché. Anche se fa più del necessario, rsyncha un --progressparametro. Il -asarà mantenere i permessi, ecc, e -hsarà leggibile.

rsync -ah --progress source destination

L'output sarà simile al seguente:

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)

4
Funziona benissimo nell'attuale Ubuntu (14.10). Supporta anche la -rbandiera per ricorrere alle directory. Può anche essere modificato come sostituto diretto di cp:alias cp="rsync -ah --progress"
Rustyx,

1
Funziona a gonfie vele su OS X, con il vantaggio di poter usare gli strumenti inclusi nel sistema.
Ivan X,

3
mi piace questa alternativa meglio di pv, specialmente perché rsync fa parte dell'installazione standard
Joao Costa,

1
@bartekbrak grazie per la condivisione. Sono attualmente su macOS 10.12.x in esecuzione la versione homebrew di rsync 3.1.2 e l'utilizzo --progressfa girare la testa 🙃 guardando tutto il display di uscita nel terminale. Quindi quelli che arrivano qui dalle ricerche di parole chiave AOL, rsync -ah --info=progress2 [source] [destination] presentano l'output in un modo un po 'più sano IM IMHO.
ipatch

2
Sfortunatamente, l'output non è molto utile quando si copiano molti piccoli file.
Raffaello,

89

Se vuoi vedere se i tuoi file vengono trasferiti correttamente, puoi usarli gcped gcpè come cp, ma per impostazione predefinita ti dà una barra di avanzamento in modo da poter vedere cosa viene copiato. Come nota la wiki del programma , gcpha diverse funzioni utili come

  • indicazione di progressione del trasferimento
  • copia continua in caso di errore (salta al file successivo)
  • copia dello stato di registrazione: gcp registra tutte le sue azioni in modo che sia possibile sapere quali file sono stati copiati correttamente
  • manipolazione dei nomi per gestire le limitazioni del filesystem di destinazione (ad esempio la cancellazione di caratteri incompatibili "*" o "?" su FAT)

Tuttavia, anche quando la barra di avanzamento ha raggiunto il 100% quando si utilizza lo strumento, è necessario attendere fino alla ricomparsa del prompt del terminale prima di rimuovere in sicurezza i supporti in modo da poter assicurarsi che il processo di trasferimento sia terminato correttamente.

gcpè usato per copiare i file e ha opzioni come quella --preserveche consente di preservare vari attributi e autorizzazioni e di --recursivecopiare intere directory. Maggiori informazioni sulle sue opzioni sono disponibili accedendo man gcpo andando alle manpage di Ubuntu online . Un tutorial è disponibile anche su questo sito .

Installa gcpdai repository con

sudo apt-get install gcp

( Nota : in Ubuntu 12.10 il nuovo punto di montaggio automatico è, ad esempio, /media/user/usbdisk)

È possibile copiare un file sul supporto inserendo

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

e copia una cartella sul tuo supporto con

gcp -rv ~/Podcasts /media/Mik2

Esempio di output da gcpcon l'indicatore di stato:

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

Ovviamente puoi specificare più file o cartelle da copiare sul tuo disco e ci sono molte altre opzioni coperte man gcp.


4
Si è verificato un errore con sshdbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
msa7,

3
se hai un display X11 aperto sulla macchina, puoi semplicemente impostare export DISPLAY=:0.0prima di avviare gcp. Se la macchina è senza testa, allora dovresti iniziare una xsession in un framebuffer virtuale o qualcosa del genere, a quel punto probabilmente dovresti semplicemente cercare un altro programma
user292067

2
gcpè abbastanza decente ma il requisito DBUS / X è strano. Ho gestito questo su SSH usando l'inoltro ssh: ssh -X user@hoste questo mi ha permesso di eseguirlo.
Oli

68

Ottengo un calcio dall'uso di cURL per questo preciso scopo. La pagina man elenca il protocollo "FILE" come supportato, quindi basta usarlo come qualsiasi altro protocollo in un URL:

curl -o destination FILE://source

Velocità, avanzamento, tempo rimanente e altro ancora, il tutto in un formato familiare.


1
Questo è ottimo soprattutto negli ambienti in cui è vietato installare nuovi strumenti e dove rsync non è disponibile.

5
Fantastico, questo deve essere un trucco noto!
ionreflex,

Bella risposta! Intelligente!
9301293,

Questo ha presumibilmente la stessa svantaggio come pv, che non salverà i permessi.
Ploni,

1
Dolce! un modo per farlo funzionare per una directory?
Joseph Rajeev Motha,

28

Sebbene non visualizzi la velocità, quando si copiano più file, l' -vopzione al cpcomando fornisce informazioni sull'avanzamento. per esempio

cp -rv old-directory new-directory

10
Informazioni sullo stato di avanzamento? Questo è solo un output dettagliato. Per fornire informazioni sull'avanzamento dovresti almeno ora quanti file, o anche quali file, devono essere copiati.
Julian F. Weinert,

Mostra su quale file si trova, che può essere sufficiente nei casi meno impegnativi.
Gringo Suave,

20

Il kernel conosce la maggior parte dei dati come la velocità e spesso anche la percentuale. I kernel moderni espongono questo tramite il loro filesystem / proc.

showspeed da https://github.com/jnweiger/showspeed utilizza tali informazioni. Può collegarsi a programmi già in esecuzione e fornire aggiornamenti periodici come questo:

$ 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)
...

Ben fatto. Come funziona le percentuali però? Immagino solo in caso di file aperto come di sola lettura? E probabilmente non funzionerà in caso di accesso sparso.
j_kubik,

1
In questo caso puoi anche usare un altro terminale per pkill -USR1 ddfar ddvedere il suo stato, un'altra opzione sarebbe watch -n 1 pkill -USR1 ddfargli mostrare periodicamente i suoi progressi (ogni secondo).
Yaron,

Giusto. Molti strumenti hanno un modo integrato per riportare le statistiche nel tempo. dd non fa eccezione. Le implementazioni moderne hanno un'opzione status = progess. Showspeed è una soluzione "one tool for one purpose" in stile unix classico, proprio come pv. Ma ha diversi casi d'uso: pensa alle tazze che pompano un file tramite ghostscript o vuoi conoscere l'ETA per un cp o tar in corso. Potrebbe essere fatto il 95% già dopo alcune ore e probabilmente non vorrai riavviarlo solo per aggiungere pv ... L'accesso sparso non funzionerebbe bene. Showspeed solo i campioni cercano posizioni.
Jürgen Weigert,

18

Esiste uno strumento chiamato progressnei repository che è in grado di esaminare vari comandi diversi e visualizzare informazioni sullo stato di avanzamento per essi.

Installalo usando il comando

sudo apt-get install progress

Questo strumento può essere utilizzato in questo modo:

cp bigfile newfile & progress -mp $!

Produzione:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)

12

Mentre è in pvgrado di gestire cpattività locali , l'utilizzo dddi pvpuò gestire attività sia locali ( cp) che remote ( scp).

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

Assicurati di path/to/dest.mkvuscire datouch path/to/dest.mkv

Questo può mostrare l'avanzamento, ma se desideri le informazioni sulla percentuale,

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

Sostituisci 100Msopra con la dimensione reale del tuo file sorgente.

Ecco che arriva la parte remota

Mentre scpdifficilmente può mostrare i progressi attuali, l'utilizzo ddcon pvè un gioco da ragazzi.

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


11

Esiste un nuovo strumento chiamato cv che può trovare qualsiasi descrittore relativo a un comando in esecuzione e mostrare progressi e velocità: https://github.com/Xfennec/cv

cv -w

genera le statistiche per tutte le operazioni in esecuzione di cp, mv ecc


watch cv -qè anche più
ordinato

Mostra solo i progressi per un singolo file, si rende conto se a cpsta copiando una directory in modo ricorsivo o meno.
Flimm,

1
È stata ribattezzata guerra per progredire. Ottimo strumento!
sebastian,

7

Come molti hanno detto, cp non include questa funzionalità.

Solo per lanciare i miei $ 0,02, quello che faccio di solito con situazioni di copia banali (cioè no -R):

  1. Guarda quanto è grande il file e ricorda

  2. Inizia a copiare

  3. Apri un altro terminale

  4. Esegui watch ls -lh DIRsulla directory in cui si trova la destinazione

Questo può tenermi aggiornato sulla dimensione del file di destinazione, con una seccatura piuttosto minima.

In alternativa a situazioni meno banali, ad esempio la copia ricorsiva di directory, è possibile utilizzare watch du -hs DIRper visualizzare un riepilogo delle dimensioni DIR. Tuttavia, du può richiedere molto tempo per il calcolo e può anche rallentare la copia, quindi potresti voler usare l' -n INTERVALargomento per guardare in modo che il compromesso sia accettabile.

Aggiornamento: Nel caso in cui si utilizzino caratteri jolly con il comando utilizzato con watch du, ad esempio watch du -hs backup/*, non dimenticare di citare:

watch "du -hs backup/*"

in caso contrario i caratteri jolly verranno espansi solo una volta , quando l'orologio viene avviato in modo che du non guardi i nuovi file / sottodirectory.


Non risponde alla parte "velocità", però ...
Alois Mahdal

7

dd status=progress

Opzione aggiunta in GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Il terminale mostra una linea di tipo:

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

Vedi anche: Come monitorate l'avanzamento di dd?


1
Volevi dire: stdout è un flusso di caratteri e sequenze di escape vt100 che rendono il tuo terminale visualizzato una linea periodicamente aggiornata;). stdout è sempre un flusso di byte e non ha nulla a che fare con il modo in cui viene visualizzato (tranne per il fatto che l'applicazione può sapere se è attualmente collegata a un terminale o no ...)
masterxilo

A Newmaster @masterxilo non importerà, gli esperti lo sapranno ;-) hehe
Ciro Santilli 改造 改造 中心 法轮功 六四 六四

Beh, penso che sia sempre bene dichiarare le cose come sono, magari tralasciando alcuni dettagli, ma mai fare in modo che i tuoi lettori producano un modello mentale sbagliato. Se dici "stdout è una linea (periodicamente aggiornata)" sembra che stdout sia un blocco di memoria mutabile che non lo è. Questo è importante sapere anche per i neofiti.
masterxilo,

6

Se si dispone di rsync 3.1 o versioni successive ( rsync --version), è possibile copiare (cp -Rpn) preservando autorizzazioni e proprietà, directory di ricorso, "no clobber" e visualizzare lo stato di avanzamento generale (anziché solo i progressi per file), la velocità di copia e ( molto approssimativo) tempo rimanente stimato con:

sudo rsync -a --info=progress2 --no-i-r /source /destination

Nota che sudo è necessario solo se hai a che fare con directory / file che non possiedi. Inoltre, senza il simbolo --no-i-r, la percentuale potrebbe reimpostare su un numero inferiore ad un certo punto durante la copia. Forse le versioni successive di rsync verranno impostate automaticamente su no-ir con info = progress2, ma non nella versione corrente di 3.1.2.

Ho scoperto che la percentuale e il tempo rimanenti sono notevolmente sopravvalutati quando si copia in una directory che contiene già file (ad es. Come quando si userebbe tipicamente cp -n "no clobber").


3

Usa uno script di 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
}

Questo sembrerà:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

fonte


3

A seconda di ciò che vuoi fare, Midnight Commander ( mc) potrebbe essere la risposta. Sono sorpreso che non sia stato ancora menzionato.

Strumenti come pvo rsyncsono buoni per visualizzare l'avanzamento del trasferimento di un file enorme, ma quando si tratta di copiare intere directory / alberi, mccalcola le dimensioni e quindi visualizza l'avanzamento molto bene. Inoltre è disponibile nella maggior parte dei sistemi.


2
"è disponibile per la maggior parte dei sistemi". ... non su alcuna installazione predefinita di Ubuntu.
Muru,

1

potrebbe essere un'altra opzione per conservare gli attributi (se sourceè una cartella in cui verrà creata destination)

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

spero che possa essere utile a qualcuno. Per avere un tempo di trasferimento stimato, questo può essere ottenuto facendo do -s sourcein anticipo e passandolo come -s <size>parametro a pv.


-f -è ridondante. tarl 'output predefinito per ce input per xsono stdout e stdin.
muru,

Può dipendere dalla versione del sistema operativo / tar? So che è un sito Ubuntu ma questo può essere utile per altri proprietari di sistemi operativi come macOS
ciekawy,

1
No. Tutte le implementazioni sane (incluso tar tar di libarchive, che utilizza macOS) hanno questo comportamento.
muru,

appena verificato su macos e il tuo suggerimento è perfettamente valido - ho aggiornato la mia risposta. Grazie!
ciekawy,

0

È possibile copiare utilizzare qualsiasi programma. Allo stesso tempo, puoi avviare sudo iotope vedere la velocità di lettura / scrittura del disco, ma senza progressi.


0

Controlla il codice sorgente per progress_bar nel repository git sottostante

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

Prova anche il pacchetto di script bash personalizzato supreme

Scarica il file deb e installalo nella distribuzione basata su debian o scarica i file sorgente, modifica e usa per altre distro

Panoramica delle funzionalità

(1) Apri app ---- Firefox ---- Calcolatrice ---- Impostazioni

(2) Gestisci file ---- Cerca ---- Naviga ---- Accesso rapido

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

(3) Gestisci telefono ---- Sposta / Copia dal telefono ---- Sposta / Copia sul telefono ---- Sincronizza cartelle

(4) Gestisci USB ---- Sposta / Copia da USB ---- Sposta / Copia su USB


0

pv sa come guardare i descrittori di file dati un pid, che sia cp o qualcos'altro

Dalla documentazione:

   (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

Esempio:

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] [     <=>                                                                   ] 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.