Come posso spostare i file e visualizzare l'avanzamento (ad es. Con una barra di avanzamento)?


118

Quando si spostano directory di grandi dimensioni utilizzando mv, c'è un modo per visualizzare l'avanzamento (%)? Il cpcomando su gentoo aveva un -ginterruttore che mostrava i progressi.


3
Misurare il throughput della pipe nella shell potrebbe aiutare, anche se non so se è possibile utilizzare facilmente quegli strumenti quando si sposta un file
Michael Mrozek

Risposte:


50

È possibile creare un cp e un mv patchati che supportano entrambi l'opzione -g per mostrare l'avanzamento. Ci sono istruzioni e patch in questa pagina . Tuttavia : la pagina ti dice di fare

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv

che sovrascrive l'originale cp e mv. Ciò ha due svantaggi: in primo luogo, se un pacchetto coreutils aggiornato arriva sul tuo sistema, viene sovrascritto. In secondo luogo, se la versione con patch presenta un problema, potrebbero interrompere gli script basandosi su standard cp e mv. Preferirei fare qualcosa del genere:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg

che copia i file in / usr / local / bin che è destinato ai programmi compilati dall'utente e dà loro un nome diverso. Quindi quando vuoi una barra di avanzamento, dici mvg -g bigfile /mnt/backupe usi mv normalmente.

Inoltre puoi farlo, alias mvg="/usr/local/mvg -g"devi solo dire mvg bigfile /mnt/backupe ottenere direttamente la barra di avanzamento.


2
Sfortunatamente la patch su "questa pagina" non è più presente e non sembra essere stata indicizzata nel Web Archive. Sembra che ci siano molte patch con un nome e una funzione simili , potresti modificare la tua risposta per chiarire quale intendevi?
Gilles,

Penso che github.com/atdt/advcpmv sia un successore valido e abbia la stessa patch, quindi ho cambiato il link per puntarlo.
fschmitt,

93

Non mi piace l'idea di sovrascrivere i binari da coreutil quando ci sono soluzioni più semplici, quindi ecco i miei:

rsync : Rsync copia i file e ha un -Pinterruttore per una barra di avanzamento. Quindi se hai installato rsync, potresti usare un semplice alias nel dotfile delle tue shell:

alias cp='rsync -aP'

Il rovescio della medaglia è che rsync è un po 'più lento di cp, ma dovresti misurarlo con il tempo e decidere da solo, posso conviverci :-)

Shell Script : uno script di shell può anche creare la barra di avanzamento. L'ho trovato qualche tempo fa in rete e non ricordo la fonte:

#!/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% [===============================>                      ]

barra :

'bar' - 'cat' con barra di avanzamento ASCII

barè un piccolo script shell per visualizzare una barra dei processi per tutti i tipi di operazioni (cp, tar, ecc.). Puoi trovare esempi sulla homepage del progetto.

È anche scritto per il bourne shell, quindi verrà eseguito nelle vicinanze ovunque.


3
barnon si avvolge mvancora.
Tobu,


1
Si noti che rsyncnon sostituisce completamente mv(l'OP chiede), specialmente quando si tratta di copie veloci su file system copy-on-write come btrfs.
Karl Richter,

74

C'è un nuovo strumento chiamato progressche può trovare qualsiasi descrittore relativo a un comando in esecuzione e mostrare progressi e velocità: disponibile qui

progress -w

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


3
WOW, non mi aspettavo che fosse così fantastico! Ho semplicemente digitato progressdopo l'installazione e mi ha presentato i progressi per il mvcomando che stavo aspettando. Grazie!
jredd,

3
Grazie! Quando sposti roba come root sembra che tu debba usare sudo(lo stesso utente immagino) - puoi anche usare watchper dire cosa sta succedendo ogni 2 secondi:watch progress -w
Wilf,

6
Programma fantastico, ma quando si sposta ad esempio una cartella con molti file mostra solo l'avanzamento del file corrente, non l'intera cartella in totale. Invece di watch progress -wte puoi anche semplicemente usareprogress -m
mxmlnkn il

6
IMHO, questo è il modo più semplice per risolvere il problema. Invece di rattoppare coreutils o usare strumenti che non sono designati per scopi specifici (come rsync per mv) o scrivere script di overkilling, usa semplicemente quello strumento scritto per scopi specifici con amore.
Lutto il

34

Puoi usare il comando pipe viewerpv per mostrare la barra di avanzamento:

pv /original/file > /new/file

Lo uso spesso per copiare un file di grandi dimensioni su un filesystem di rete montato (combinare con gzipe tar). Lo svantaggio è che puoi copiare solo un file e non una directory. E devi dare un nome al nuovo file, non puoi semplicemente dare la directory di destinazione come cpfa. Tuttavia, la copia non pvè uno scopo. È uno strumento potente e fa molto di più che copiare semplicemente un file. Vedi la homepage per ulteriori esempi di pv.

Un'opzione molto migliore è usare rsync -aP. Se invece lo desideri mv, aggiungi la bandiera --remove-source-files. Aggiungi questo al tuo .bashrcse vuoi usare frequentemente i comandi:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

L'aspetto negativo qui è che rsync mostra solo i progressi, non una barra di avanzamento.


tar cf - source-dir | pv | tar xf - -C out-dirti darà il throughput di un'intera directory. Se conosci le dimensioni e passi -sa PV può anche darti progressi.
Arantius,

6

Se il tuo obiettivo è spostare / copiare una directory con barra di avanzamento, ma evitando la GUI non terminale, mc (Midnight Commander) è una buona scelta.


3

La mia soluzione è usare rsync. Può copiare directory, rimuovere i file sorgente dopo una copia riuscita (quindi "spostarli") e visualizzare rapporti sullo stato di avanzamento, tra le molte altre funzionalità (in particolare la sincronizzazione di directory parzialmente copiate e il lavoro in rete).

Ecco come vorrei spostare una directory con rsync, con il rapporto sullo stato di avanzamento:

rsync -aP --remove-source-files $src $dst && rm -r $src

Assicurarsi che $srcnon non terminare con un backslash, altrimenti si otterrà un significato diverso da quello di GNU cp.

Alla rm -rfine è necessario perché --remove-source-filesrimuove solo i file di origine, dopo che ognuno è stato copiato con successo, non le directory. Si &&assicura di eseguirlo solo se rsync viene completato correttamente. Se sei paranoico, puoi sostituirlo con una sorta di ricorsivo rmdir, come ad esempiofind $src -d -exec rmdir {} +

L'unico problema è che l' -Popzione mostra l'avanzamento per ciascun file, non per l'intera operazione di copia. Questo potrebbe essere inutile se stai cercando di spostare una directory con molti piccoli file. L'ultima versione di sviluppo di rsync ha un flag alternativo --info=progress2che mostra i progressi per l'intera operazione.


2

Per evitare coreutil patch per aggiungere alla barra di avanzamento mve cp, gcp(copiatrice di Goffi) è una nuova alternativa: http://wiki.goffi.org/wiki/Gcp/en

Usare allo stesso modo delle cpopzioni -rdi ricorsività e -vverbosità.

Utilizza una coda di file quando vengono richiamati più comandi contemporaneamente. Permette anche di registrare i nomi dei file copiati in un registro, vedere la sezione della pagina man di salvataggio della fonte per i dettagli.

Ecco un buon tutorial per iniziare gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/


C'è gmv come gcp per cp?
CodyChan,

Non ho trovato alcun equivalente. A proposito, non c'è bisogno di barra di avanzamento quando si esegue "mv" su un singolo file system ... è abbastanza veloce. Se lo spostamento viene eseguito su due diversi file system, viene implementato come cp e quindi rimuove l'origine se ha esito positivo o rimuove la destinazione in caso di errore. Un semplice script di shell basato su gcp può farlo correttamente (con un primo controllo per sapere se l'origine e la destinazione sono realmente su diversi file system)
Yves Martin

2

Prima di tutto: non copio mai file di grandi dimensioni senza usare ionice, a meno che non sappia che non voglio usare il computer per mezz'ora o più.

In secondo luogo: tutte le mie partizioni sono registrate, quindi la copia intrapartizione non richiede tempo. Se è una copia lunga, faccio un du -smfile e df -m | grep copy_to_partition. Quindi, se curioso, quanto tempo ci vorrà, lo faccio di dfnuovo e vedo quanti file sono stati copiati.


Ti andrebbe di condividere i tuoi consigli ionici? quale priorità daresti a mp cpu-wise e disk i / o sise? Ecco le mie impostazioni, ma il carico della CPU è ancora elevato anche dopo il renicing: imgur.com/a/DLMJplz
ychaouche

2

Sulla mia Menta mi piace usare gcp su questa o sulla soluzione di arricciatura (che è davvero carina)

gcp SOURCE DESTINATION

Potrebbe essere necessario installarlo sudo apt-get install gcp

E un compito molto bello ed eccellente per la barra di avanzamento con informazioni su

  • % Totale
  • % Ricevuta
  • % Xferd
  • DL medio
  • Velocità di caricamento
  • Tempo rimasto
  • Tempo impiegato
  • Tempo totale
  • Velocità attuale

in un bel formato leggibile è:

curl -o DESTINATION FILE://source

Inoltre, potrebbe essere necessario installarlo prima sudo apt-get install curl


gcpnon supporta lo spostamento di file, ovvero i file di origine devono essere rimossi manualmente dopo una copia riuscita.
Karl Richter,

2

Questo non ti dà una barra di avanzamento, ma premi CTRL-Te invierai un SIGINFOa mv, che riporterà su quale file sta lavorando e quanto a lungo nel processo è. Abbastanza utile avere questo per trasferimenti di file di grandi dimensioni, forse non altrettanto utile per un trasferimento con molti file di piccole dimensioni.

Esempio rapido:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%

1
Questo non ha funzionato per me: penso INFO: unknown signal; killall -l lists signals. che SIGINFO sia solo su alcuni BSD, non in POSIX standard.
Brian Minton,

2
Giusto. Funziona su Mac OS X, ma probabilmente non su Ubuntu.
Charles

1

Utilizzare mv -vper stampare una riga per file spostato e pv -lper stampare l'avanzamento in base al conteggio delle righe (in effetti conteggio file).

Avrai bisogno di pv(pipe viewer): http://www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

Utilizzare il comando seguente per ottenere il conteggio dei file:

find sourcedir | wc -l

Questo comando mostrerà le informazioni sull'avanzamento in base al numero di file copiati. Funziona meglio se ci sono molti file piccoli. Se ci sono solo pochi file che sono enormi, non ti divertirai molto.

Si noti che mvsulla stessa partizione dovrebbe essere veloce. mva un'altra partizione sarebbe la stessa cp source targetseguita da rm source. Quindi ecco due comandi per copiare le directory con le informazioni sullo stato.

per segnalare lo stato di avanzamento in base al numero di file copiati:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

per segnalare lo stato di avanzamento in base ai byte copiati:

tar c sourcedir | pv -s size | tar x -C targetdir

Vedere qui per maggiori dettagli: informazioni sullo stato di avanzamento tramite pv per la copia della directory


1

Invariabilmente finisco per cercare questa risposta dopo aver avviato il comando 'mv', a quel punto non voglio avviarla di nuovo. Se ti trovi in ​​questa situazione, è un modo molto semplice per monitorare i progressi (o per vedere se è abbastanza lungo da non vale la pena ucciderlo):

du -hs /directory/you're/moving/data/to

Questo stamperà semplicemente la dimensione della directory in modo da poter vedere quanti dati sono stati copiati o eseguirli un paio di volte per vedere quanto velocemente vengono trasferiti i dati.

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.