Domanda Come mostrare il progresso e la velocità del trasferimento durante la copia di file con cp?


Altrimenti, c'è qualche utilità di riga di comando alternativa che può raggiungere questo obiettivo?


274
2017-12-14 04:48


origine




risposte:


Mentre cp non ha questa funzionalità, puoi usarla pv per 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 come se li avessi creati tu e apparterrai a te.

In questo esempio, pv in pratica si limita a emettere il file su stdout *, che si reindirizza a un file usando il > operatore. Allo stesso tempo, stampa le informazioni sull'andamento del terminale quando lo fai.

Questo è quello che sembra:

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

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


*: Il bit tecnico

Ci sono tre flussi importanti di dati in un sistema unix-like: stdout (output standard), stderr (errore standard) e stdin (input standard). Ogni programma ha tutti e tre, per così dire. Il > l'operatore di reindirizzamento reindirizza l'output del programma su un file. Senza argomenti, come vedi sopra, > reindirizza un programma uscita standard in un file. cp fondamentalmente non ha niente di più bello di

cat source > destination

(dove cat legge un file e lo stampa sullo stdout). pv è proprio come cat, ma se si reindirizza lo stream di output da qualche altra parte, stamperà invece le informazioni sullo stato di avanzamento sullo stdout.

Dare un'occhiata a man pv per saperne di più.


Un'altra opzione, come alt textDOR suggerisce in questa risposta, usa invece rsync:

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

Ciò manterrà i permessi / proprietà dei file mentre mostra i progressi.


204
2017-12-14 05:17



Può o non può essere significativo (a seconda della situazione), ma pv non gestisce i permessi allo stesso modo di cp fa ... (basato su un test rapido che ho provato: pv non ha copiato il bit di esecuzione attraverso rsync fatto. - Peter.O
IMO: alias cp="rsync -avz" cp è obsoleto. - Marco Ceppi♦
Se sei come me, e dimenticati pv, puoi andare a curiosare /proc/PID of cp/fd e /proc/PID of cp/fdinfo per capire i progressi. (Dipende da te inferire velocità.) Uso questa tecnica per guardare updatedb. - Thanatos
Sì, -z dovrebbe probabilmente essere utilizzato solo per le copie di rete; comprimere e decomprimere i dati per una copia locale è puro sovraccarico. - Matthew Read
@Rodrigo rsync -avzP è ciò che vorrete usare. - Marco Ceppi♦


Non c'è. Vedere Qui sul perché. Anche se fa più del necessario, rsync ne ha uno con --progress parametro. -A manterrà le autorizzazioni, ecc, e -h sarà leggibile dall'uomo.

rsync -ah --progress source destination

L'output sarà simile a questo:

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)

130
2017-10-15 08:06



Funziona alla grande nell'attuale Ubuntu (14.10). Supporta anche il -r bandiera per recurse directory. Può anche essere alias come sostituzione diretta per cp: alias cp="rsync -ah --progress" - rustyx
I lavori si gonfiano su OS X, con il vantaggio di poter utilizzare gli strumenti inclusi nel sistema. - Ivan X
questo è fantastico, l'output è simile filename MB-copied MB-speed time-remaining) - Rudolf Olah
Mi piace questa alternativa meglio di pv, specialmente perché rsync fa parte dell'installazione standard - Joao Costa
@bartekbrak grazie per aver condiviso. Sono attualmente su macOS 10.12.x in esecuzione versione homebrew di rsync 3.1.2 e utilizzo --progress mi fa girare la testa guardando tutto il display di uscita nel terminale. Quindi quelli che vengono qui da ricerche di parole chiave AOL, rsync -ah --info=progress2 [source] [destination]  presenta l'output in un modo un po 'più sano IM IMHO. - Chris


Se vuoi vedere se i tuoi file si stanno trasferendo correttamente puoi usare gcp e gcp è come cp ma di default ti dà una barra di avanzamento in modo che tu possa vedere cosa viene copiato. Come del programma note wiki, gcp ha diverse funzioni utili come

  • indicazione della progressione del trasferimento
  • copia continua su errore (salta al file successivo)
  • copia lo stato di registrazione: gcp registra tutte le sue azioni in modo che sia possibile sapere quali file sono stati copiati con successo
  • nome mangling per gestire i limiti del filesystem di destinazione (ad esempio eliminazione di caratteri incompatibili "*" o "?" su FAT)

Tuttavia, anche quando la barra di avanzamento ha raggiunto il 100% quando si utilizza lo strumento, è necessario attendere finché il prompt del terminale non riappare prima di rimuovere in modo sicuro il supporto in modo da assicurarsi che il processo di trasferimento sia terminato correttamente.

gcp è usato per copiare file e ha opzioni come --preserve in modo che vari attributi e permessi possano essere preservati e --recursivein modo che possano essere copiate intere directory. Maggiori informazioni sulle sue opzioni possono essere trovate inserendo man gcp o andando al Manpage di Ubuntu online. È disponibile anche un tutorial su questo sito.

Installare gcp dai repository con

sudo apt-get install gcp

(Nota: in Ubuntu 12.10 il nuovo punto di automount è, per esempio, /media/user/usbdisk)

È possibile copiare un file sul supporto inserendo

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

e copia una cartella sul tuo media con

gcp -rv ~/Podcasts /media/Mik2

Esempio di output da gcp con la barra di avanzamento:

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 in man gcp.


84
2017-10-15 11:09



Ci sono errori con ssh dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 - msa7
se hai un display X11 aperto sulla macchina, puoi semplicemente impostarlo export DISPLAY=:0.0 prima di iniziare gcp. Se la macchina è senza testa, dovresti avviare una xsession in un framebuffer virtuale o qualcosa del genere, a quel punto dovresti probabilmente cercare un altro programma - user292067
gcp è abbastanza decente, ma il requisito DBUS / X è strano. Ho gestito questo su SSH utilizzando l'inoltro ssh: ssh -X user@host e questo mi ha permesso di eseguirlo. - Oli♦


Mi piace l'uso di cURL per questo scopo esatto. 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à, progresso, tempo rimanente e altro ancora: tutto in un formato familiare.


54
2018-02-02 09:00



Ciò è particolarmente utile in ambienti in cui è vietato installare nuovi strumenti e dove rsync non è disponibile.
Brillante, questo deve essere un hack noto! - ionreflex
Bella risposta! Intelligente! - 9301293
Questo presumibilmente ha il stesso inconveniente come pv, che non salverà le autorizzazioni. - Ploni


Mentre non visualizza la velocità, quando si copiano più file, il file -v opzione per il cp comando ti fornirà informazioni sullo stato di avanzamento. per esempio.

cp -rv old-directory new-directory

22
2017-12-14 17:17



Informazioni sul progresso? Questo è solo un output prolisso. Per fornire informazioni sullo stato di avanzamento avresti almeno bisogno di sapere quanti file, o anche quali file, devono essere copiati. - Julian F. Weinert


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

showpeed da https://github.com/jnweiger/showspeed usa queste informazioni Può essere collegato 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)
...

19
2018-02-25 14:34



Ben fatto. Come funziona comunque le percentuali? Immagino solo in caso di file aperti solo in lettura? E probabilmente non funzionerà in caso di accesso disperso. - j_kubik
In questo caso puoi anche utilizzare un altro terminale per l'esecuzione pkill -USR1 dd fare dd mostrare il suo stato, un'altra opzione sarebbe watch -n 1 pkill -USR1 dd per farlo mostrare periodicamente i suoi progressi (ogni secondo). - Yaron
Destra. Molti strumenti hanno un modo integrato per riportare statistiche nel tempo. dd non fa eccezione. Le implementazioni moderne hanno un'opzione status = progess. Showspeed è una soluzione classica "one tool for one purpose" in stile unix, proprio come pv. Ma ha diversi usi: pensa a tazze che pompano un file attraverso ghostscript o vuoi sapere l'ETA per un cp o tar in corso. Potrebbe essere già fatto al 95% dopo poche ore e probabilmente non vorrai riavviarlo solo per aggiungere pv ... L'accesso sparso non funzionerebbe bene. Mostra solo i campioni cercano posizioni. - Jürgen Weigert


Mentre pv può trattare con locale cp compiti, usando dd con pv può occuparsi sia dicp) e remoto (scp) compiti.

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

Per favore assicurati di path/to/dest.mkv esce da touch path/to/dest.mkv

Questo può mostrare il progresso, ma se vuoi le informazioni sulla percentuale,

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

Sostituire 100M sopra con la dimensione reale del tuo file sorgente.

Ecco la parte remota

Mentre scp Difficilmente può mostrare progressi attuali, usando dd con pv è un pezzo di torta.

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

11
2018-01-05 08:08



Più nuovo dd ha status=progress: askubuntu.com/a/824895/52975 - Ciro Santilli 新疆改造中心 六四事件 法轮功


C'è un nuovo strumento chiamato cv che può trovare qualsiasi descrittore relativo ad un comando in esecuzione e mostrare progresso e velocità: https://github.com/Xfennec/cv

cv -w

emette le statistiche per tutte le operazioni in esecuzione cp, mv, ecc


10
2017-07-13 11:33



watch cv -q è ancora più ordinato - nwgat
Mostra solo i progressi per un singolo file, ma realizza se a cp sta copiando una directory in modo ricorsivo o meno. - Flimm
La guerra ribattezzata per progredire. Ottimo strumento! - sebastian


C'è uno strumento chiamato progress nei repository che è in grado di esaminare vari comandi diversi e visualizzare informazioni di avanzamento per loro.

Installalo usando il comando

sudo apt-get install progress

Questo strumento può essere usato in questo modo:

cp bigfile newfile & progress -mp $!

Produzione:

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

10
2017-09-26 22:35





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

Solo per buttare i miei $ 0.02, quello che faccio di solito con situazioni di copia banali (per esempio no -R):

  1. Guarda quanto è grande il file e ricorda

  2. Inizia a copiare

  3. Apri un altro terminale

  4. Correre watch ls -lh DIR nella directory in cui si trova il target

Questo può tenerti aggiornato sulle dimensioni del file di destinazione, con un minimo problema.

Come alternativa per situazioni meno banali, ad es. copiando ricorsivamente le directory, puoi usare watch du -hs DIR per vedere il riepilogo delle dimensioni DIR. Tuttavia du può richiedere molto tempo per calcolare e può anche rallentare la copia, quindi potresti volerlo usare -n INTERVAL argomento da osservare in modo che il trade-off sia accettabile.

Aggiornare: Nel caso in cui utilizzi le wild card con il comando usato con watch du, ad es. watch du -hs backup/*, non dimenticare di citare:

watch "du -hs backup/*"

altrimenti le wild-card saranno espanse solo una volta, quando l'orologio è iniziato quindi du non guarderà nuovi file / sottodirectory.


6
2017-11-16 13:20



Non risponde alla parte "velocità", anche se ... - Alois Mahdal