2011-08-19 9 views
37

Suppongo che potrei confrontare il numero di file nella directory di origine con il numero di file nella directory di destinazione man mano che cp progredisce, o magari farlo con la dimensione della cartella, invece? Ho cercato di trovare degli esempi, ma sembra che tutte le barre di progresso di bash siano state scritte per copiare singoli file. Voglio copiare un sacco di file (o una directory, se il primo non è possibile).Come posso creare una barra di avanzamento (cp copiando una directory)?

+11

Hai colpito [Bash FAQ # 44] (http: // mywiki .wooledge.org/BashFAQ/044). Dai un'occhiata e vedi se c'è qualche suggerimento utile. – jw013

risposta

7

Si può dare un'occhiata allo strumento vcp. Questo è uno strumento di copia semplice con due barre di avanzamento: una per il file corrente e una per il generale.

EDIT

ecco il link alle fonti: http://members.iinet.net.au/~lynx/vcp/ Manpage può essere trovato qui: http://linux.die.net/man/1/vcp

La maggior parte delle distribuzioni hanno un pacchetto per esso.

+0

Speravo in qualcosa che non richiedesse la compilazione di strumenti esterni. Voglio solo vedere la mia directory essere copiata. È davvero così difficile? – octosquidopus

+0

@Anonymouse ha aggiunto una seconda risposta, forse questa sarebbe un'alternativa per te. Ma questa è la mia ultima idea :( –

+1

Come detto sotto, rsync è disponibile su tutti i sistemi (anche su Mac OS), al contrario di vcp. – Adrien

4

Ecco un'altra soluzione: utilizzare lo strumento bar

Si potrebbe richiamare in questo modo:

#!/bin/bash 
filesize=$(du -sb ${1} | awk '{ print $1 }') 
tar -cf - -C ${1} ./ | bar --size ${filesize} | tar -xf - -C ${2} 

Devi andare la strada sopra il catrame, e sarà inesatte sul file di piccole dimensioni. Inoltre, è necessario fare attenzione che la directory di destinazione esista. Ma è un modo.

+0

All'inizio pensavo di tarare la cartella prima di spostarla, ma pensavo che sarebbe mancata troppo in eleganza. Ho sbagliato, funziona come previsto e potrebbe essere in alcuni casi una soluzione migliore Grazie! – octosquidopus

49

È inoltre possibile utilizzare rsync invece di cp come questo:

rsync -Pa source destination

Quale ti fornirà una barra di avanzamento e il tempo stimato di completamento. Molto maneggevole.

+6

A destra, 'rsync --progress/path/to/origin/path/to/destination' è fantastico ed è disponibile su tutti i sistemi – Adrien

+0

Funziona anche quando si copia un singolo file. – Nathan

+0

Capita di conoscere il confronto della velocità tra rsync e cp? – Allasso

18

per mostrare una barra di avanzamento, mentre facendo una copia ricorsiva di file & cartelle & sottocartelle (inclusi i link e gli attributi di file), è possibile utilizzare gcp (facilmente installato in Ubuntu e Debian eseguendo "sudo apt-get install GCP") :

gcp -rf SRC DEST 

Ecco l'output tipico durante la copia di una grande cartella di file:

Copying 1.33 GiB 73% |#####################  | 230.19 M/s ETA: 00:00:07 

noti che si vede solo una barra di avanzamento per l'intera operazione, mentre se si desidera una sola barra di avanzamento per ogni file, è possibile utilizzare rsync:

rsync -ah --progress SRC DEST 
+1

gcp è basato su Python. PER FAVORE, NON UTILIZZARE IN PRODUZIONE. Non ho controllato, ma a quanto pare non supporta hardlink, attributi speciali e così via. – socketpair

+0

gcp non funziona su un terminale remoto (ad esempio tramite ssh). –

2

Un semplice modo unix è quello di andare nella directory di destinazione e fare watch -n 5 du -s. Forse renderlo più carino mostrandolo come un bar. Ciò può essere d'aiuto in ambienti in cui sono disponibili solo gli utilizzatori unix standard e nessun ambito di installazione di file aggiuntivi. du-sh è la chiave, l'orologio è solo fare ogni 5 secondi. Pro: funziona su qualsiasi sistema Unix Contro: No Barra di avanzamento

1

mia opzione preferita è Advanced Copy, in quanto utilizza i cp file originali.

$ wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz 
$ tar xvJf coreutils-8.21.tar.xz 
$ cd coreutils-8.21/ 
$ wget --no-check-certificate https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch 
$ patch -p1 -i advcpmv-0.5-8.21.patch 
$ ./configure 
$ make 

I nuovi programmi si trovano ora in src/cp e src/mv. Si può scegliere di sostituire i comandi esistenti:

$ sudo cp src/cp /usr/local/bin/cp 
$ sudo cp src/mv /usr/local/bin/mv 
+0

Il link alla patch su zwicke.org è rotto ma è su github all'indirizzo https://github.com/atdt/advcpmv. Forse qualcuno con più abilità di quanto aggiornerò i passi di @ elboletaire. – Setaa

+0

Posso farlo, grazie per i link alla patch – elboletaire

0

ne dite qualcosa come

find . -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /DEST/$(dirname {}) 

Essa trova tutti i file nella directory corrente, tubi che attraverso PV dando PV una dimensione stimata in modo il misuratore di avanzamento funziona e quindi esegue il piping su un comando CP con il flag --parents in modo che il percorso DEST corrisponda al percorso SRC.

Un problema che ho ancora da superare è che se si emette questo comando

find /home/user/test -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /www/test/$(dirname {}) 

il percorso di destinazione diventa/www/test/home/utente/test/.... FILES ... e io sono incerto su come dire al comando di eliminare la parte '/ home/user/test'. Ecco perché devo eseguirlo dall'interno della directory SRC.

0

Per aggiungere un'altra opzione, è possibile utilizzare cpv. Utilizza pv per imitare l'utilizzo di cp.

Funziona come pv, ma è possibile utilizzarlo per copiare in modo ricorsivo directory

enter image description here

Si può ottenere here

Problemi correlati