Questão Como mostrar o progresso da transferência e velocidade ao copiar arquivos com cp?


Caso contrário, existe algum utilitário alternativo de linha de comando que possa alcançar isso?


274
2017-12-14 04:48


origem




Respostas:


Enquanto cp não tem essa funcionalidade, você pode usar pv para fazer isso:

pv my_big_file > backup/my_big_file

Nota: este método perderá as permissões e a propriedade do arquivo. Os arquivos copiados dessa maneira terão as mesmas permissões que você criou e pertencerão a você.

Neste exemplo, pv basicamente apenas exibe o arquivo para stdout *, que você redireciona para um arquivo usando o > operador. Simultaneamente, imprime informações sobre o progresso para o terminal quando você faz isso.

Isto é o que parece:

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

Você pode precisar Instalar pv (alternativamente, digite sudo apt-get install pv) no seu sistema.


*: O pouco técnico

Existem três fluxos importantes de dados em um sistema similar ao unix: stdout (saída padrão), stderr (erro padrão) e stdin (entrada padrão). Todo programa tem todos os três, por assim dizer. o > O operador de redirecionamento redireciona a saída do programa para um arquivo. Sem argumentos, como você vê acima, > redireciona um programa saída padrão para um arquivo. cp basicamente não faz nada mais extravagante do que

cat source > destination

(Onde cat apenas lê um arquivo e imprime para stdout). pv é como cat, mas se você redirecionar seu fluxo de saída para outro lugar, ele imprimirá as informações de progresso para stdout.

Dê uma olhada man pv para aprender mais sobre isso.


Outra opção, como alt textDoR sugere em esta resposta, é usar o rsync em vez disso:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

Isso preservará as permissões / propriedade dos arquivos enquanto exibe o progresso.


204
2017-12-14 05:17



Pode ou não ser significativo (dependendo da situação), mas pv não controla permissões da mesma forma que cp faz ... (baseado em um teste rápido eu tentei: pv não copiou o bit de execução rsync fez. - Peter.O
IMO: alias cp="rsync -avz" cp está desatualizado. - Marco Ceppi♦
Se você é como eu e esquece pvvocê pode ir bisbilhotando /proc/PID of cp/fd e /proc/PID of cp/fdinfo para descobrir o progresso. (Cabe a você inferir a velocidade.) Eu uso essa técnica para assistir updatedb. - Thanatos
Sim, -z provavelmente só deve ser usado para cópias de rede; compactar e descompactar os dados para uma cópia local é pura sobrecarga. - Matthew Read
@Rodrigo rsync -avzP é o que você vai querer usar. - Marco Ceppi♦


Não há. Vejo Aqui porquê. Embora faça mais do que você precisa, o rsync tem um com --progress parâmetro. O -a manterá as permissões, etc, e -h será legível por humanos.

rsync -ah --progress source destination

A saída será algo como isto:

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)

130
2017-10-15 08:06



Isso funciona muito bem no Ubuntu atual (14.10). Ele também suporta o -r sinalizar para recriar diretórios. Pode até ser aliado como substituto direto do cp: alias cp="rsync -ah --progress" - rustyx
O Works incha no OS X, com o bônus de poder usar ferramentas incluídas no sistema. - Ivan X
isso é ótimo, a saída parece filename MB-copied MB-speed time-remaining) - Rudolf Olah
Eu gosto desta alternativa melhor do que pv, especialmente porque o rsync é parte da instalação padrão - Joao Costa
@bartekbrak obrigado por compartilhar. Eu estou atualmente no macOS 10.12.x rodando a versão homebrew do rsync 3.1.2 e usando --progress faz minha cabeça girar assistindo toda a exibição de saída no terminal. Então, aqueles que vêm aqui de pesquisas por palavra-chave da AOL, rsync -ah --info=progress2 [source] [destination]  apresenta a saída em um pouco mais sane ‍️ maneira IMHO. - Chris


Se você quiser ver se seus arquivos estão sendo transferidos corretamente, você pode usar gcp e gcp é como o cp, mas por padrão lhe dá uma barra de progresso para que você possa ver o que está sendo copiado. Como o programa notas wiki, gcp tem vários recursos úteis, como

  • indicação de progressão de transferência
  • cópia contínua em erro (pule para o próximo arquivo)
  • copiar o registro de status: o gcp registra todas as suas ações para que seja possível saber quais arquivos foram copiados com sucesso
  • name mangling para lidar com as limitações do sistema de arquivos de destino (por exemplo, exclusão de caracteres incompatíveis "*" ou "?" no FAT)

No entanto, mesmo quando a barra de progresso atingir 100% ao usar a ferramenta, você deve aguardar até que seu prompt de terminal reapareça antes de remover sua mídia com segurança para que você possa garantir que o processo de transferência foi concluído com êxito.

gcp é usado para copiar arquivos e tem opções como --preserve para que vários atributos e permissões possam ser preservados e --recursivepara que diretórios inteiros possam ser copiados. Mais informações sobre suas opções podem ser encontradas man gcp ou indo para o Manpages Ubuntu on-line. Um tutorial também está disponível nesse site.

Instalar gcp dos repositórios com

sudo apt-get install gcp

(Nota: no Ubuntu 12.10 o novo ponto de montagem automática é, por exemplo, /media/user/usbdisk)

Você pode copiar um arquivo para sua mídia digitando

gcp /home/mike/file.mp4 /media/usb

e copie uma pasta para sua mídia com

gcp -rv ~/Podcasts /media/Mik2

Exemplo de saída de gcp com a barra de progresso:

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

É claro que você pode especificar vários arquivos ou pastas para copiar para o seu disco, e há muitas outras opções man gcp.


84
2017-10-15 11:09



Tem erro com isso por causa do ssh dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 - msa7
se você tem um display X11 aberto na máquina, você pode apenas definir export DISPLAY=:0.0 antes de iniciar o gcp. Se a máquina é sem cabeça, então você teria que iniciar uma xsession em um framebuffer virtual ou algo assim, nesse ponto você provavelmente deveria procurar outro programa - user292067
gcp é bastante decente, mas o requisito DBUS / X é estranho. Eu lidei com isso sobre SSH usando o encaminhamento ssh: ssh -X user@host e isso me permitiu executá-lo. - Oli♦


Eu recebo um chute de usar cURL para esse propósito exato. A página man lista o protocolo "FILE" como suportado, portanto, use-o como qualquer outro protocolo em um URL:

curl -o destination FILE://source

Velocidade, progresso, tempo restante e muito mais - tudo em um formato familiar.


54
2018-02-02 09:00



Isso é ótimo, especialmente em ambientes onde você está proibido de instalar novas ferramentas e onde o rsync não está disponível.
Brilhante, isso tem que ser um hack conhecido! - ionreflex
Boa resposta! Esperto! - 9301293
Isso presumivelmente tem o mesma desvantagem Como pv, que não salvará as permissões. - Ploni


Embora não exiba velocidade, ao copiar vários arquivos, o -v opção para o cp O comando fornecerá informações de progresso. por exemplo.

cp -rv old-directory new-directory

22
2017-12-14 17:17



Informação de progresso? Esta é apenas a saída detalhada. Para fornecer informações de progresso, você precisaria pelo menos agora quantos arquivos, ou até mesmo quais arquivos, precisam ser copiados. - Julian F. Weinert


O kernel conhece a maioria dos dados, como velocidade, e geralmente também porcentagem. Kernels modernos expõem isso através de seu sistema de arquivos / proc.

mostra a velocidade de https://github.com/jnweiger/showspeed usa essa informação. Ele pode ser anexado a programas já em execução e fornecer atualizações periódicas como esta:

$ 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)
...

19
2018-02-25 14:34



Agradável. Como isso funciona percentagens embora? Eu acho que apenas no caso de arquivos abertos como somente leitura? E provavelmente não funcionará em caso de acesso disperso. - j_kubik
Neste caso, você também pode usar outro terminal para executar pkill -USR1 dd fazer dd mostrar seu status, outra opção seria watch -n 1 pkill -USR1 dd para mostrar seu progresso periodicamente (a cada segundo). - Yaron
Certo. Muitas ferramentas foram criadas para reportar estatísticas ao longo do tempo. dd não é exceção. Implementações modernas têm uma opção status = progess. O Showspeed é uma solução clássica de estilo unix "uma ferramenta para uma finalidade" - assim como o pv. Mas tem casos diferentes: pense em xícaras que bombeiam um arquivo através do ghostscript ou você quer saber o ETA para um cp ou tar em andamento. Pode ser 95% feito já depois de algumas horas e você provavelmente não quer reiniciar isso apenas para adicionar pv ... Acesso disperso não iria funcionar bem. Showspeed apenas amostras buscam posições. - Jürgen Weigert


Enquanto pv pode lidar com locais cp tarefas, usando dd com pv pode lidar com ambos local (cp) e remoto (scp) tarefas.

dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

Por favor assegure o path/to/dest.mkv saídas por touch path/to/dest.mkv

Isso pode mostrar o progresso, mas se você quiser as informações de porcentagem,

dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

Substituir 100M acima com o tamanho real do seu arquivo de origem.

Aqui vem a parte remota

Enquanto scp dificilmente pode mostrar o progresso atual, usando dd com pv é um pedaço de bolo.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

11
2018-01-05 08:08



Mais recente dd tem status=progress: askubuntu.com/a/824895/52975 - Ciro Santilli 新疆改造中心 六四事件 法轮功


Existe uma nova ferramenta chamada cv que pode encontrar qualquer descritor relacionado a um comando em execução e mostrar progresso e velocidade: https://github.com/Xfennec/cv

cv -w

gera as estatísticas para todas as operações em execução no cp, mv etc.


10
2017-07-13 11:33



watch cv -q é ainda mais puro - nwgat
Ele só mostra o progresso de um arquivo individual, ele percebe se um cp está copiando um diretório recursivamente ou não. - Flimm
A guerra renomeou para progredir. Ótima ferramenta! - sebastian