it-swarm.it

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

Quando si spostano directory di grandi dimensioni usando mv, c'è un modo per vedere l'avanzamento (%)? Il comando cp su gentoo aveva un -g interruttore che ha mostrato l'avanzamento.

129
letronje

È 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 è inteso per i programmi compilati dall'utente e dà loro un nome diverso. Quindi, quando vuoi una barra di avanzamento, dici mvg -g bigfile /mnt/backup e usa mv normalmente.

Inoltre puoi fare alias mvg="/usr/local/mvg -g" allora devi solo dire mvg bigfile /mnt/backup e ottieni direttamente la barra di avanzamento.

50
fschmitt

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 -P passa a 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 :-)

Script shell : uno script 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% [===============================>                      ]

bar :

"Barra" - "gatto" con ASCII

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

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

96
echox

C'è un nuovo strumento chiamato progress che 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

92
naugtur

Puoi usare viewer pipe comando pv 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 (in combinazione con gzip e 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 fa cp. Tuttavia, la copia non ha lo scopo di pv. È 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 vuoi mv, aggiungi il flag --remove-source-files. Aggiungi questo al tuo .bashrc se vuoi usare frequentemente i comandi:

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

Il rovescio della medaglia qui è che rsync mostra solo i progressi, non una barra di avanzamento.

36
Lamnk

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

6
Christian Madsen

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 $src fa not termina in una barra rovesciata, altrimenti otterrai un significato diverso da quello di GNU cp.

Il rm -r alla fine è necessario perché --remove-source-files rimuove solo i file di origine, dopo che ciascuno è stato copiato correttamente, non le directory. Il && si assicura di eseguirlo solo se rsync viene completato correttamente. Se sei paranoico, puoi sostituirlo con una sorta di _ ricorsivo rmdir, come find $src -d -exec rmdir {} +

L'unico inconveniente è che il -P L'opzione 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=progress2 che mostra i progressi per l'intera operazione.

4
Tobia

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 -sm sui file e df -m | grep copy_to_partition. Quindi, se sono curioso di sapere quanto tempo ci vorrà, faccio di nuovo il df e vedo quanto dei file è stato copiato.

2
HandyGandy

Questo non ti dà una barra di avanzamento, ma premi CTRL-T e invierai un SIGINFO a mv, che riporterà su quale file sta lavorando e fino a che punto del 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%
2
Charles

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

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 formato leggibile piacevole è:

curl -o DESTINATION FILE://source

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

2
ThePentadactyl

Per evitare patch coreutil per aggiungere la barra di avanzamento a mv e cp, gcp (Goffi's CoPier) è una nuova alternativa: http: //wiki.goffi. org/wiki/GCP/en

Utilizzare allo stesso modo di cp con opzioni -r per ricorsività e -v per verbosità.

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 man page di salvataggio della fonte per i dettagli.

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

2
Yves Martin

Uso mv -v per stampare una riga per file spostato e pv -l per stampare l'avanzamento in base al conteggio delle righe (in effetti conteggio dei file).

Avrai bisogno di pv (viewer pipe): 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 mv sulla stessa partizione dovrebbe essere veloce. mv in un'altra partizione sarebbe uguale a cp source target seguito 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
lesmana

Invariabilmente, finisco per cercare questa risposta after Avvio il comando 'mv', a quel punto non voglio ricominciare. 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.

1
qazmonk

Uso il seguente script salvato con rsmv name:

#!/usr/bin/env bash

rsync -aP --remove-source-files "[email protected]" && rm -rf "${@:1:$#-1}"

Gestisce più di una fonte e nomi di file con spazi bianchi:

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel