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)?
risposta
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.
Speravo in qualcosa che non richiedesse la compilazione di strumenti esterni. Voglio solo vedere la mia directory essere copiata. È davvero così difficile? – octosquidopus
@Anonymouse ha aggiunto una seconda risposta, forse questa sarebbe un'alternativa per te. Ma questa è la mia ultima idea :( –
Come detto sotto, rsync è disponibile su tutti i sistemi (anche su Mac OS), al contrario di vcp. – Adrien
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.
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
C'è uno strumento pv
di fare questa cosa esatta: http://www.ivarch.com/programs/pv.shtml
C'è una versione di Ubuntu in apt
È 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.
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
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
gcp non funziona su un terminale remoto (ad esempio tramite ssh). –
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
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
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
Posso farlo, grazie per i link alla patch – elboletaire
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.
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
Si può ottenere here
- 1. come codificare una barra di avanzamento
- 2. Come creare una barra di avanzamento personalizzata in Android?
- 3. Come creare una barra di avanzamento indeterminata in WinForms?
- 4. Android: come creare una barra di avanzamento orizzontale usando Interpolator?
- 5. Come posso creare una barra nella parte inferiore di un'app Java, come una barra di stato?
- 6. Il modo migliore per creare una barra di avanzamento segmentata?
- 7. Come posso aggiungere una barra di avanzamento a WWW :: Mechanize?
- 8. Disegna una stringa su una barra di avanzamento, come JProgressBar?
- 9. Come creare una finestra di dialogo MFC con una barra di avanzamento in un thread separato?
- 10. Come connettere una barra di avanzamento a una funzione?
- 11. Come creare una barra di avanzamento per una connessione NSURLC quando si scarica un file?
- 12. Una barra di avanzamento per scikit-learn?
- 13. Come copiare più file da una directory diversa usando cp?
- 14. Aggiornamento di una barra di avanzamento in una RecyclerView
- 15. Come posso posizionare una barra di avanzamento a destra della barra degli strumenti?
- 16. Come si chiama una barra di avanzamento del ciclo?
- 17. Android: come cambio l'altezza di una barra di avanzamento?
- 18. Come creare una barra di avanzamento circolare in puro QML + JS?
- 19. Come creare una directory iOS?
- 20. Come si implementa una barra di avanzamento in C#?
- 21. Come avere una barra di avanzamento in jQuery.get()
- 22. Come implementare una barra di avanzamento utilizzando il pattern MVVM
- 23. Come creare una cartella/directory
- 24. Come leggere la risposta ffmpeg da java e usarla per creare una barra di avanzamento?
- 25. Come posso creare una progressbar infinita in WinForms?
- 26. Barra di avanzamento circolare
- 27. Traboccante il testo di una barra di avanzamento bootstrap
- 28. Barra di avanzamento per AVAssetExportSession
- 29. Fare una barra di avanzamento della console? (Windows)
- 30. Mostra una barra di avanzamento durante il caricamento di un'attività
Hai colpito [Bash FAQ # 44] (http: // mywiki .wooledge.org/BashFAQ/044). Dai un'occhiata e vedi se c'è qualche suggerimento utile. – jw013