È possibile vedere la velocità cp e la percentuale copiata?


251

Sto riscontrando problemi durante la copia di file di grandi dimensioni utilizzando nautilus (si blocca). Devo copiare, usando cp. Vorrei sapere se ci sono parametri che mostrano la% copiata e anche la velocità di trasferimento.


39
È possibile utilizzare rsyncinvece di cp. Ha --progressun'opzione.
frostschutz,

2
Midnight Commanderfunziona anche bene e ha un'interfaccia utente piuttosto testuale con barre di avanzamento, ma potrebbe non essere installata. Prova mcsul prompt dei comandi. Inoltre, ovviamente, non lo è cp.
un CVn

3
Usarlo rsynccon --progressmi ha appena fatto capire cosa sta succedendo. Si blocca quando raggiunge il 100%, quindi dura un paio di minuti alla fine. Penso che sia lo stesso che sta accadendo con nautilus. Comunque questa è già un'altra domanda, quindi la migliore risposta a questa domanda è la rsync --progress, mostra dimensioni,%, velocità e tempo trascorso.
yzT

2
un problema con rsync è che funziona più lentamente di una copia pura. Sul mio grande server, la differenza è rispettivamente di 60 MB / se 300 MB / s.
pdwalker,

1
@pdwalker anche con l' -Wopzione? su tutti i miei host rsyncè quasi veloce come cp... così vicino che uso regolarmente rsyncinvece di cp.
Skaperen,

Risposte:


193

rsyncha un flag chiamato progress2che mostra la percentuale complessiva:

rsync --info=progress2 source dest

5
--info = progress2 non è ancora diventato un repository predefinito e qui è il 2015. Sembra una buona idea.
Lonniebiz,

1
--info=progress2finalmente incluso in version 3.1.0 protocol version 31. Forse potresti modificare la tua risposta, yzT.
Sopalajo de Arrierez,

1
Ho notato --info=progress2che rsync è velocissimo! 200 MB / s, mentre Windows non supera i 90 MB / s!
ReneFroger,

1
@ReneFroger anche se potrebbe essere la velocità reale (a seconda del dispositivo), spesso in Linux tale velocità è davvero falsa e dopo che la copia è terminata il sistema sta ancora scrivendo sul dispositivo, a differenza di Windows che è possibile espellere il dispositivo quasi immediatamente. Se copi file di grandi dimensioni, puoi notare come inizia a quella velocità ma poi scende fino a quello standard.
yzT

7
ha funzionato per me solo con --progress. rsync versione 3.0.9
adrianTNT

103

Se consenti altri strumenti rispetto a cpquanto è sicuramente possibile. Per un singolo file è possibile utilizzare pv. È un piccolo strumento che fornisce statistiche interessanti.

pv inputfile > outputfile

Se hai più file o directory puoi usare tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Puoi avvolgerlo in una funzione shell. È meno da digitare e si ottiene una semantica simile a quella di cp. Ecco una funzione molto semplice (e non a prova di errore!):

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

Si noti che alcune versioni di tarnon supportano la sintassi sopra menzionata (ad esempio Solaris tar) e è necessario utilizzare la seguente variante:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

Lo chiami così

cpstat sourceDirectory destinationDirectory

È possibile migliorarlo ulteriormente, in modo da pvfornire una stima del tempo rimanente.

Un'altra soluzione (come menzionato da frostschutz in un commento) è usare rsync con l' --progressopzione:

rsync --progress -a sourceDirectory destinationDirectory

1
cpstat sta andando nel pastebin =)
Matt,

7
Questo ti darà velocità di trasferimento, ma non ETA, perché pvnon sa quanti dati verranno inviati attraverso la pipe. Puoi specificare questo usando -s. Ad esempio, prima fare du -sh sourceDirectoryper avere un'idea (di massima), per poi passarlo a pv, in questo modo: pv -s 100m.
Jan Fabry,

1
--info = progress2 fornisce statistiche sui progressi a livello di directory.
AlexLordThorsen,

vbuf(debian, ubuntu) è un po 'più veloce di pv, probabilmente a causa del suo buffer di anello virtuale
Skaperen,

@Skaperen Non lo so vbuf. Ma come sembra essere in Debian instabile al momento e quindi spesso non disponibile sui server che di solito eseguono Debian stable.
Marco,

58

rsync funziona meglio per mostrare l'avanzamento durante l'avanzamento della copia.

ex:

rsync -avh --progress sourceDirectory destinationDirectory

27

Come spiegato in altre risposte, cp non fornisce tale funzionalità. Tuttavia, il progresso (precedentemente chiamato cv) è un piccolo strumento che è molto utile nel fornire questa caratteristica mancante.

Questo strumento può essere descritto come un comando Tiny Dirty Linux solo * C che cerca i comandi di base coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ...) attualmente in esecuzione sul sistema e visualizza la percentuale di copie dati.

L'ho usato negli ultimi mesi ed è solido.


non sembra funzionare con tutti i filesystem (es. cifs) ma +1, non sapevo che uscite così pazze
Akostadinov

1
Si noti che questo progetto è ora chiamato "progress - Coreutils Progress Viewer (precedentemente noto come cv)".
Chappjc,

17

È possibile vedere la velocità cp e la percentuale copiata?

Sì, è possibile visualizzare l'avanzamento del comando cpsul terminale.


Metodo n. 1: (utilizzare progress)

Apri un nuovo terminale e digita progressvisualizzerà l'avanzamento del cpcomando e altri comandi come:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

Se non è stato installato progress, è possibile installarlo dal repository, per esempio nel CentOScon questo comando: yum -y install progress.

Quindi dopo aver eseguito il cpcomando in background o dopo aver eseguito cpnormalmente, apri un altro terminale, quindi prova questo comando:

# progress -m

Vedi output:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

Metodo n. 2: (usa patch cp)

Oppure scarica GNU coreutilse patch.

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

Correre:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Copia i due file cpe mvloacated sotto coreutils-8.21/src/a /usr/local/bin:

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

O copiarlo usando il tuo file manager come root

Aggiungi le seguenti righe al tuo ~/.bashrc:

alias cp='cp -gR'
alias mv='mv -g'

Esci e accedi

La barra di avanzamento può essere visualizzata senza –go –progress-barcome raccomandato dall'autore

Vedi output:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

Fonte: linuxhelp


1
Questa sembra la vera fonte della cppatch: web.archive.org/web/20131115171331/http://beatex.org/web/…
Kaushal Modi

1
+1 per il suggerimento sul progresscomando
Peter

questa è l'unica vera risposta
Alessio l'

14

Ho notato che questo post era piuttosto vecchio. Ma mentre ho preparato una soluzione al problema, ho pensato di pubblicare la mia soluzione.

Scenario: abbiamo una struttura di directory molto grande che vogliamo copiare, quindi immettiamo il comando cp -R sourcedir destdir in una finestra terminale.

Apri un'altra finestra del terminale o sposta il processo sullo sfondo (Ctrl+Z,bg<CR>), quindi facciamo un indicatore di progresso nel modo del ghetto:

Innanzitutto otteniamo la dimensione totale della struttura di directory che vogliamo copiare, lo fai con:

du -sh /path/sourcedirectory/

Converti il ​​risultato in gigabyte (G), quindi sostituisci la n con il risultato ottenuto nella dimensione della fonte variabile. Dopo aver inserito la dimensione e destdir (directory di destinazione), eseguire il comando di seguito.

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

Questo stamperà l'avanzamento ogni 10 secondi con messaggi come:

0.100% completed
0.200% completed
0.300% completed 
... etc

Sono consapevole che questa soluzione non ha affrontato la velocità di copia, ma sarebbe possibile aggiungerlo espandendo i comandi sopra, possibilmente trasformandolo in uno script bash, quindi sarebbe più facile da leggere. Ad esempio controllando quanti dati vengono copiati pr. n unità di tempo, la velocità dovrebbe essere banale da calcolare e visualizzare.


Questo è in realtà perfetto per il mio caso d'uso, quindi grazie per averlo pubblicato! Voglio sapere i progressi della copia di un'enorme directory con migliaia di file, non solo un file, quindi le altre soluzioni non mi aiutano davvero.
Ibrahim,

Questo è fantastico, specialmente in casi come quello che sto vivendo in questo momento: ha avviato in remoto un enorme lavoro mv per spostare terrabyte di backup da un pool di archiviazione a un altro, senza pensare in anticipo alle implicazioni. Ora posso facilmente approfondire il processo e dare un'occhiata. Eccezionale!
Riley,

8

Per migliorare la risposta di Marco, oggi ho scritto questa versione di cpstat, così puoi copiare molte directory e usare l'ultimo parametro come percorso di destinazione. Si noti che se si utilizza un percorso profondo relativo come origine, è possibile, grazie a tar, creare automaticamente lo stesso albero di directory dipendente.

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}

6

Non in una versione standard di cp.

È possibile eseguire lo sfondo del CP ed elencare le dimensioni in attesa del cpcompletamento.

Uso questo perl per monitorare la crescita di un singolo file ma viene eseguito esternamente al cp (o qualsiasi altra cosa stia facendo)



5

Anche se rsyncti fornirà alcune statistiche sui progressi, se vuoi una barra di progresso dovresti usare pv.

Puoi usare cpvun wrapper per pvuna sintassi più semplice, più simile a quello cpche puoi usare per copiare ricorsivamente le directory

inserisci qui la descrizione dell'immagine

Puoi ottenerlo qui


+1 per il suggerimento attivo pv. Bella scoperta!
Peter,

4

L'uso di uno strumento come mc(comandante di mezzanotte) può essere una buona opzione alternativa ad altre risposte.

È un semplice file manager che mostra i progressi di copia / spostamento.



4

Un'altra soluzione semplice è semplicemente guardare la cartella di output come segue:

Linux / Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

Questa utile utility verrà eseguita dued evidenzierà le differenze.

Un'altra potenziale soluzione sarebbe quella di scrivere un semplice script che esegua il loop, chiamando due sputando una stima approssimativa del throughput.


3

Questo strumento è un comando di utility Linux che cerca i comandi di base di coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ecc.) Attualmente in esecuzione sul sistema e visualizza la percentuale di dati copiati:

https://github.com/Xfennec/cv


1
Questo è già stato suggerito da @AmrMostafa nel novembre '14.
Dubu,

2

Ho appena avuto un caso in cui cp era più o meno bloccato a causa di un bug FUSE nel filesystem di ricezione.

Se non puoi semplicemente passare da cp (cioè perché --sparse = always) e vuoi qualcosa che sia effettivamente affidabile per il progresso, vai su / proc.

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0

0

VCP: copia i file in un'interfaccia curses (Mostra la barra di avanzamento in Linux).

DESCRIZIONE: vcp copia file e directory in un'interfaccia curses, con l'output del solo testo disponibile. le sue opzioni e output sono simili al cp di BSD mentre aggiungono alcune nuove funzionalità.

Fornisce informazioni su:

  • file copiati e lasciati da copiare
  • dati scritti e dimensione totale dei dati
  • dati scritti ogni secondo
  • due barre di stato, uno che mostra lo stato del file corrente, l'altro stato totale (tranne con 1 file, entrambi mostrano corrente) e percentuale

quando l'output viene inviato alla console:

  • una barra di stato
  • dimensioni copiate e velocità

Pagina man di VCP: https://linux.die.net/man/1/vcp

Scarica vcp-2.2.tar.gz da:

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

Dipendenza: curses.h (libncurses-dev).

Su Ubuntu, installa:

sudo apt-get install libncurses-dev

o

sudo apt-get install libncurses5-dev

INSTALLA vcp:

make && make install

Manuale:

man vcp
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.