Altrimenti, esiste qualche utilità di riga di comando alternativa che può ottenere questo risultato?
Altrimenti, esiste qualche utilità di riga di comando alternativa che può ottenere questo risultato?
Risposte:
Sebbene cp
non abbia questa funzionalità, puoi usare pv
per fare questo:
pv my_big_file > backup/my_big_file
Nota: questo metodo perderà le autorizzazioni e la proprietà del file. I file copiati in questo modo avranno le stesse autorizzazioni di se li avessi creati tu e appartenessero a te.
In questo esempio, pv
fondamentalmente restituisce semplicemente il file a stdout *, che reindirizza a un file utilizzando l' >
operatore. Allo stesso tempo, stampa le informazioni sullo stato di avanzamento sul terminale quando lo fai.
Ecco come appare:
stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
138MB 0:00:01 [73.3MB/s] [=================================>] 100%
Potrebbe essere necessario installare pv (in alternativa, digitare sudo apt-get install pv
) sul proprio sistema.
*: Il bit tecnico
Esistono tre importanti flussi di dati in un sistema simile a unix: stdout (output standard), stderr (errore standard) e stdin (input standard). Ogni programma ha tutti e tre, per così dire. L' >
operatore di reindirizzamento reindirizza l'output del programma su un file. Senza argomenti, come vedi sopra, >
reindirizza l' output standard di un programma su un file. cp
praticamente non fa niente di più fantasioso di
cat source > destination
(dove cat
legge solo un file e lo stampa su stdout). pv
è come cat, ma se reindirizzi il flusso di output da qualche altra parte, stamperà invece le informazioni sull'avanzamento su stdout.
Dai un'occhiata man pv
per saperne di più.
Un'altra opzione, come suggerisce DoR in questa risposta , è invece usare rsync:
$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
621.22M 57% 283.86MB/s 0:00:01
Ciò conserverà i permessi / proprietà dei file mentre mostrerà i progressi.
alias cp="rsync -avz"
cp è obsoleto.
pv
, puoi andare a curiosare /proc/PID of cp/fd
e /proc/PID of cp/fdinfo
capire i progressi. (Sta a te inferire la velocità.) Uso questa tecnica per guardare updatedb
.
-z
probabilmente dovrebbe essere usato solo per copie di rete; comprimere e decomprimere i dati per una copia locale è puro sovraccarico.
rsync
assicurarsi di non aggiungere il trailing /
al percorso di origine (o rimuovere, ad esempio, se il completamento bash lo inserisce automaticamente). Altrimenti otterrai risultati diversi rispetto a quando usi cp
(o gcp
).
Non c'è. Vedi qui perché. Anche se fa più del necessario, rsync
ha un --progress
parametro. Il -a
sarà mantenere i permessi, ecc, e -h
sarà leggibile.
rsync -ah --progress source destination
L'output sarà simile al seguente:
Pictures/1.jpg
2.13M 100% 2.28MB/s 0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
1.68M 100% 1.76MB/s 0:00:00 (xfr#5899, to-chk=0/5905)
-r
bandiera per ricorrere alle directory. Può anche essere modificato come sostituto diretto di cp:alias cp="rsync -ah --progress"
--progress
fa girare la testa 🙃 guardando tutto il display di uscita nel terminale. Quindi quelli che arrivano qui dalle ricerche di parole chiave AOL, rsync -ah --info=progress2 [source] [destination]
presentano l'output in un modo un po 'più sano IM IMHO.
Se vuoi vedere se i tuoi file vengono trasferiti correttamente, puoi usarli gcp
ed gcp
è come cp, ma per impostazione predefinita ti dà una barra di avanzamento in modo da poter vedere cosa viene copiato. Come nota la wiki del programma , gcp
ha diverse funzioni utili come
- indicazione di progressione del trasferimento
- copia continua in caso di errore (salta al file successivo)
- copia dello stato di registrazione: gcp registra tutte le sue azioni in modo che sia possibile sapere quali file sono stati copiati correttamente
- manipolazione dei nomi per gestire le limitazioni del filesystem di destinazione (ad esempio la cancellazione di caratteri incompatibili "*" o "?" su FAT)
Tuttavia, anche quando la barra di avanzamento ha raggiunto il 100% quando si utilizza lo strumento, è necessario attendere fino alla ricomparsa del prompt del terminale prima di rimuovere in sicurezza i supporti in modo da poter assicurarsi che il processo di trasferimento sia terminato correttamente.
gcp
è usato per copiare i file e ha opzioni come quella --preserve
che consente di preservare vari attributi e autorizzazioni e di --recursive
copiare intere directory. Maggiori informazioni sulle sue opzioni sono disponibili accedendo man gcp
o andando alle manpage di Ubuntu online . Un tutorial è disponibile anche su questo sito .
Installa gcp
dai repository con
sudo apt-get install gcp
( Nota : in Ubuntu 12.10 il nuovo punto di montaggio automatico è, ad esempio, /media/user/usbdisk
)
È possibile copiare un file sul supporto inserendo
gcp /home/mike/file.mp4 /media/usb
e copia una cartella sul tuo supporto con
gcp -rv ~/Podcasts /media/Mik2
Esempio di output da gcp
con l'indicatore di stato:
gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################| 7.98 M/s Time: 00:00:22
Ovviamente puoi specificare più file o cartelle da copiare sul tuo disco e ci sono molte altre opzioni coperte man gcp
.
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
export DISPLAY=:0.0
prima di avviare gcp. Se la macchina è senza testa, allora dovresti iniziare una xsession in un framebuffer virtuale o qualcosa del genere, a quel punto probabilmente dovresti semplicemente cercare un altro programma
gcp
è abbastanza decente ma il requisito DBUS / X è strano. Ho gestito questo su SSH usando l'inoltro ssh: ssh -X user@host
e questo mi ha permesso di eseguirlo.
Ottengo un calcio dall'uso di cURL per questo preciso scopo. La pagina man elenca il protocollo "FILE" come supportato, quindi basta usarlo come qualsiasi altro protocollo in un URL:
curl -o destination FILE://source
Velocità, avanzamento, tempo rimanente e altro ancora, il tutto in un formato familiare.
pv
, che non salverà i permessi.
Sebbene non visualizzi la velocità, quando si copiano più file, l' -v
opzione al cp
comando fornisce informazioni sull'avanzamento. per esempio
cp -rv old-directory new-directory
Il kernel conosce la maggior parte dei dati come la velocità e spesso anche la percentuale. I kernel moderni espongono questo tramite il loro filesystem / proc.
showspeed da https://github.com/jnweiger/showspeed utilizza tali informazioni. Può collegarsi a programmi già in esecuzione e fornire aggiornamenti periodici come questo:
$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB) 9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB) 8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB) 8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB) 7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB) 7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB) 7m:18
p/4417/fd/1w /tmp/otherbigfile 67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...
pkill -USR1 dd
far dd
vedere il suo stato, un'altra opzione sarebbe watch -n 1 pkill -USR1 dd
fargli mostrare periodicamente i suoi progressi (ogni secondo).
Esiste uno strumento chiamato progress
nei repository che è in grado di esaminare vari comandi diversi e visualizzare informazioni sullo stato di avanzamento per essi.
Installalo usando il comando
sudo apt-get install progress
Questo strumento può essere utilizzato in questo modo:
cp bigfile newfile & progress -mp $!
Produzione:
[11471] cp /media/Backup/Downloads/FILENAME.file
29.9% (24.2 MiB / 16 MiB)
Mentre è in pv
grado di gestire cp
attività locali , l'utilizzo dd
di pv
può gestire attività sia locali ( cp
) che remote ( scp
).
dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv
Assicurati di path/to/dest.mkv
uscire datouch path/to/dest.mkv
Questo può mostrare l'avanzamento, ma se desideri le informazioni sulla percentuale,
dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
Sostituisci 100M
sopra con la dimensione reale del tuo file sorgente.
Mentre scp
difficilmente può mostrare i progressi attuali, l'utilizzo dd
con pv
è un gioco da ragazzi.
ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
Esiste un nuovo strumento chiamato cv che può trovare qualsiasi descrittore relativo a un comando in esecuzione e mostrare progressi e velocità: https://github.com/Xfennec/cv
cv -w
genera le statistiche per tutte le operazioni in esecuzione di cp, mv ecc
watch cv -q
è anche più
cp
sta copiando una directory in modo ricorsivo o meno.
Come molti hanno detto, cp non include questa funzionalità.
Solo per lanciare i miei $ 0,02, quello che faccio di solito con situazioni di copia banali (cioè no -R
):
Guarda quanto è grande il file e ricorda
Inizia a copiare
Apri un altro terminale
Esegui watch ls -lh DIR
sulla directory in cui si trova la destinazione
Questo può tenermi aggiornato sulla dimensione del file di destinazione, con una seccatura piuttosto minima.
In alternativa a situazioni meno banali, ad esempio la copia ricorsiva di directory, è possibile utilizzare watch du -hs DIR
per visualizzare un riepilogo delle dimensioni DIR. Tuttavia, du può richiedere molto tempo per il calcolo e può anche rallentare la copia, quindi potresti voler usare l' -n INTERVAL
argomento per guardare in modo che il compromesso sia accettabile.
Aggiornamento: Nel caso in cui si utilizzino caratteri jolly con il comando utilizzato con watch du, ad esempio watch du -hs backup/*
, non dimenticare di citare:
watch "du -hs backup/*"
in caso contrario i caratteri jolly verranno espansi solo una volta , quando l'orologio viene avviato in modo che du non guardi i nuovi file / sottodirectory.
dd status=progress
Opzione aggiunta in GNU Coreutils 8.24+ (Ubuntu 16.04):
dd if=src of=dst status=progress
Il terminale mostra una linea di tipo:
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
Vedi anche: Come monitorate l'avanzamento di dd?
Se si dispone di rsync 3.1 o versioni successive ( rsync --version
), è possibile copiare (cp -Rpn) preservando autorizzazioni e proprietà, directory di ricorso, "no clobber" e visualizzare lo stato di avanzamento generale (anziché solo i progressi per file), la velocità di copia e ( molto approssimativo) tempo rimanente stimato con:
sudo rsync -a --info=progress2 --no-i-r /source /destination
Nota che sudo è necessario solo se hai a che fare con directory / file che non possiedi. Inoltre, senza il simbolo --no-i-r
, la percentuale potrebbe reimpostare su un numero inferiore ad un certo punto durante la copia. Forse le versioni successive di rsync verranno impostate automaticamente su no-ir con info = progress2, ma non nella versione corrente di 3.1.2.
Ho scoperto che la percentuale e il tempo rimanenti sono notevolmente sopravvalutati quando si copia in una directory che contiene già file (ad es. Come quando si userebbe tipicamente cp -n "no clobber").
Usa uno script di shell:
#!/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% [===============================> ]
A seconda di ciò che vuoi fare, Midnight Commander ( mc
) potrebbe essere la risposta. Sono sorpreso che non sia stato ancora menzionato.
Strumenti come pv
o rsync
sono buoni per visualizzare l'avanzamento del trasferimento di un file enorme, ma quando si tratta di copiare intere directory / alberi, mc
calcola le dimensioni e quindi visualizza l'avanzamento molto bene. Inoltre è disponibile nella maggior parte dei sistemi.
potrebbe essere un'altra opzione per conservare gli attributi (se source
è una cartella in cui verrà creata destination
)
tar -c source | pv -e -t -p -r | tar -C destination -x
spero che possa essere utile a qualcuno. Per avere un tempo di trasferimento stimato, questo può essere ottenuto facendo do -s source
in anticipo e passandolo come -s <size>
parametro a pv
.
-f -
è ridondante. tar
l 'output predefinito per c
e input per x
sono stdout e stdin.
Controlla il codice sorgente per progress_bar nel repository git sottostante
https://github.com/Kiran-Bose/supreme
Prova anche il pacchetto di script bash personalizzato supreme
Scarica il file deb e installalo nella distribuzione basata su debian o scarica i file sorgente, modifica e usa per altre distro
Panoramica delle funzionalità
(1) Apri app ---- Firefox ---- Calcolatrice ---- Impostazioni
(2) Gestisci file ---- Cerca ---- Naviga ---- Accesso rapido
|----Select File(s)
|----Inverse Selection
|----Make directory
|----Make file
|----Open
|----Copy
|----Move
|----Delete
|----Rename
|----Send to Device
|----Properties
(3) Gestisci telefono ---- Sposta / Copia dal telefono ---- Sposta / Copia sul telefono ---- Sincronizza cartelle
(4) Gestisci USB ---- Sposta / Copia da USB ---- Sposta / Copia su USB
pv sa come guardare i descrittori di file dati un pid, che sia cp o qualcos'altro
Dalla documentazione:
(Linux only): Watching file descriptor 3 opened by another process 1234:
pv -d 1234:3
(Linux only): Watching all file descriptors used by process 1234:
pv -d 1234
Esempio:
md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============> ] 29% ETA 0:00:53
$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov: 754MiB 0:00:04 [97,2MiB/s] [======================> ] 52% ETA 0:00:07
4:/media/windows/copy.mov: 754MiB 0:00:04 [97,3MiB/s] [ <=> ]
pv
non gestisce i permessi allo stesso modo dicp
fa ... (sulla base di un test rapido ho provato:pv
ha non copia il bit di esecuzione attraverso ..rsync
. Ha fatto