Quando si spostano directory di grandi dimensioni utilizzando mv
, c'è un modo per visualizzare l'avanzamento (%)? Il cp
comando su gentoo aveva un -g
interruttore che mostrava i progressi.
Quando si spostano directory di grandi dimensioni utilizzando mv
, c'è un modo per visualizzare l'avanzamento (%)? Il cp
comando su gentoo aveva un -g
interruttore che mostrava i progressi.
Risposte:
È 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/backup
e usi mv normalmente.
Inoltre puoi farlo, alias mvg="/usr/local/mvg -g"
devi solo dire mvg bigfile /mnt/backup
e ottenere direttamente la barra di avanzamento.
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
interruttore 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.
bar
non si avvolge mv
ancora.
rsync
non sostituisce completamente mv
(l'OP chiede), specialmente quando si tratta di copie veloci su file system copy-on-write come btrfs
.
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
progress
dopo l'installazione e mi ha presentato i progressi per il mv
comando che stavo aspettando. Grazie!
sudo
(lo stesso utente immagino) - puoi anche usare watch
per dire cosa sta succedendo ogni 2 secondi:watch progress -w
watch progress -w
te puoi anche semplicemente usareprogress -m
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 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 cp
fa. 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 .bashrc
se 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-dir
ti darà il throughput di un'intera directory. Se conosci le dimensioni e passi -s
a PV può anche darti progressi.
Se il tuo obiettivo è spostare / copiare una directory con barra di avanzamento, ma evitando la GUI non terminale, mc (Midnight Commander) è una buona scelta.
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 $src
non non terminare con un backslash, altrimenti si otterrà un significato diverso da quello di GNU cp
.
Alla rm -r
fine è necessario perché --remove-source-files
rimuove 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' -P
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.
Per evitare coreutil patch per aggiungere alla barra di avanzamento mv
e cp
, gcp
(copiatrice di Goffi) è una nuova alternativa: http://wiki.goffi.org/wiki/Gcp/en
Usare allo stesso modo delle cp
opzioni -r
di ricorsività e -v
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 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/
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
file e df -m | grep copy_to_partition
. Quindi, se curioso, quanto tempo ci vorrà, lo faccio di df
nuovo e vedo quanti file sono stati copiati.
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
in un bel formato leggibile è:
curl -o DESTINATION FILE://source
Inoltre, potrebbe essere necessario installarlo prima sudo apt-get install curl
gcp
non supporta lo spostamento di file, ovvero i file di origine devono essere rimossi manualmente dopo una copia riuscita.
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 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%
INFO: unknown signal; killall -l lists signals.
che SIGINFO sia solo su alcuni BSD, non in POSIX standard.
Utilizzare 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 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 mv
sulla stessa partizione dovrebbe essere veloce. mv
a un'altra partizione sarebbe la stessa cp source target
seguita 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
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.