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

271

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

    
posta Olivier Lalonde 14.12.2010 - 05:48

15 risposte

204

Sebbene cp non abbia questa funzionalità, puoi utilizzare pv per fare ciò:

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 genera semplicemente il file su stdout *, che viene reindirizzato a un file utilizzando l'operatore > . Allo stesso tempo, stampa le informazioni sul progresso al terminale quando lo fai.

Ecco come appare:

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

Potrebbe essere necessario Installa pv (in alternativa, digita 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. L'operatore di reindirizzamento > reindirizza l'output del programma a un file. Senza argomenti, come vedi sopra, > reindirizza lo output standard di un programma in un file. cp fondamentalmente non è più divertente di

cat source > destination

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

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

Un'altra opzione, come DoR 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à le autorizzazioni / proprietà dei file mentre mostra i progressi.

    
risposta data Stefano Palazzo 14.12.2010 - 06:17
129

Non c'è. Vedi qui sul perché. Sebbene faccia più del necessario, rsync ne ha uno con il parametro --progress . -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)
    
risposta data bartekbrak 15.10.2012 - 10:06
84

Se vuoi vedere se i tuoi file stanno trasferendo correttamente potresti usare gcp e gcp è come cp ma per impostazione predefinita ti fornisce una barra di avanzamento in modo da poter vedere cosa viene copiato. Come le note wiki del programma, gcp ha diverse funzioni utili come

  
  • indicazione della progressione del trasferimento
  •   
  • copia continua su errore (salta al file successivo)
  •   
  • copia registrazione dello stato: 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 garantire 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 --recursive in modo che sia possibile copiare intere directory. Puoi trovare maggiori informazioni sulle sue opzioni immettendo man gcp o andando alle manpage di Ubuntu on-line. Un tutorial è disponibile anche su questo sito .

Installa gcp dai repository con

sudo apt-get install gcp

( Nota : in Ubuntu 12.10 il nuovo punto di automount è, 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 file multimediale 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 .

    
risposta data user76204 15.10.2012 - 13:09
53

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

    
risposta data mathemagician 02.02.2013 - 10:00
22

Sebbene non visualizzi la velocità, quando copi più file, l'opzione -v al comando cp ti fornirà informazioni sull'avanzamento. per es.

cp -rv old-directory new-directory
    
risposta data Ubuntourist 14.12.2010 - 18:17
19

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.

Mostra velocità da link utilizza tali 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)
...
    
risposta data Jürgen Weigert 25.02.2014 - 15:34
11

Sebbene pv possa gestire attività cp locali, utilizzando dd con pv è possibile gestire sia le attività locali ( cp ) che quelle remote ( scp ).

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

Assicurati che path/to/dest.mkv esca di 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

Sostituisci 100M sopra con le dimensioni reali del tuo file sorgente.

Ecco la parte remota

Sebbene scp possa difficilmente mostrare il progresso corrente, usare dd con pv è un gioco da ragazzi.

ssh [email protected] dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
    

risposta data onemach 05.01.2013 - 09:08
10

C'è un nuovo strumento chiamato cv che può trovare qualsiasi descrittore relativo ad un comando in esecuzione e mostrare progresso e velocità: link

cv -w

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

    
risposta data naugtur 13.07.2014 - 13:33
10

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

Installalo usando il comando

sudo apt-get install progress

Questo strumento può essere usato in questo modo:

cp bigfile newfile & progress -mp $!

Output:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)
    
risposta data Nathaniel A Malinowski 27.09.2016 - 00:35
6

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

Solo per buttare i miei $ 0.02, cosa che faccio di solito con situazioni di copia banale (cioè non -R ):

  1. Scopri quanto è grande il file e ricorda

  2. Inizia a copiare

  3. Apri un altro terminale

  4. Esegui watch ls -lh DIR nella directory in cui 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, è possibile utilizzare watch du -hs DIR per visualizzare il riepilogo delle dimensioni DIR. Tuttavia du può richiedere molto tempo per calcolare e può anche rallentare la copia, quindi potresti voler utilizzare l'argomento -n INTERVAL da guardare in modo che il trade-off sia accettabile.

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

watch "du -hs backup/*"

altrimenti le wild card saranno espanse una sola volta , quando watch è avviato così da non guardare i nuovi file / sottodirectory.

    
risposta data Alois Mahdal 16.11.2012 - 14:20
4

dd status=progress

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

dd if=src of=dst status=progress

Stdout è una riga periodicamente aggiornata come:

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

Vedi anche: Come controlli l'avanzamento di dd?

    
3

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

Strumenti come pv o rsync sono buoni per visualizzare l'avanzamento del trasferimento di un file enorme, ma quando si tratta di copiare intere directory / alberi, mc calcola la dimensione e quindi visualizza il progresso molto bene. Inoltre è disponibile già dalla maggior parte dei sistemi.

    
risposta data kralyk 30.01.2016 - 18:33
2

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

Sembrerà:

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

Fonte

    
risposta data Jan 01.09.2014 - 15:45
2

Se hai rsync 3.1 o superiore ( rsync --version ), puoi copiare (cp -Rpn) preservando le autorizzazioni e la proprietà, recurse directories, "no clobber" e mostra il progresso complessivo (invece di solo progresso per file) , velocità di copia e (molto approssimativo) tempo rimanente stimato con:

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

Si noti che sudo è necessario solo se si ha a che fare con directory / file che non si possiedono. Inoltre, senza --no-i-r , la percentuale può reimpostarsi su un numero inferiore in qualche momento durante la copia. Forse le versioni successive di rsync verranno impostate su no-i-r con info = progress2, ma non nella versione corrente di 3.1.2.

Ho scoperto che la percentuale e il tempo rimanenti sono grossolanamente sovrastimati quando si copia in una directory che contiene già file (ad esempio quando si utilizza in genere cp -n "no clobber").

    
risposta data S Lentz 02.03.2016 - 23:22
0

Puoi copiare utilizzare qualsiasi programma. Allo stesso tempo, puoi avviare sudo iotop e vedere la reale velocità di lettura / scrittura del disco senza progresso.

    
risposta data McKelvin 11.01.2018 - 16:47

Leggi altre domande sui tag