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

260

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

    
por Olivier Lalonde 14.12.2010 / 05:48

15 respostas

196

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

pv my_big_file > backup/my_big_file

Observação: esse 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, ele 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 bit 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 operador de pipe redireciona uma saída de programas para outra entrada de programas. O operador > redireciona uma saída padrão de programas 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 é apenas como cat, mas se você redirecionar seu fluxo de saída para algum outro lugar, ele imprimirá as informações de progresso para stdout.

Dê uma olhada em man pv para saber mais sobre isso.

Outra opção, como DoR sugere em esta resposta , é usar o rsync:

  

rsync -ah --progress source-file destination

     

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

    
por Stefano Palazzo 14.12.2010 / 06:17
120

Não há. Veja aqui sobre o porquê. Embora faça mais do que você precisa, o rsync tem um com o parâmetro --progress . 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)
    
por bartekbrak 15.10.2012 / 10:06
83

Se você quiser ver se seus arquivos estão sendo transferidos corretamente, você pode usar gcp e gcp como cp, mas, por padrão, fornece uma barra de progresso para que você possa ver o que está sendo copiado. Como as notas do wiki do programa, 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 êxito
  •   
  • nome mangling para manipular 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 o prompt do terminal reapareça antes de remover sua mídia com segurança para garantir que o processo de transferência tenha sido concluído com êxito.

gcp é usado para copiar arquivos e possui opções como --preserve para que vários atributos e permissões possam ser preservados e --recursive para que diretórios inteiros possam ser copiados. Mais informações sobre suas opções podem ser encontradas inserindo man gcp ou indo para as páginas do Ubuntu online . Um tutorial também está disponível neste site .

Instale 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 cobertas em man gcp .

    
por user76204 15.10.2012 / 13:09
53

Eu adoro usar o 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.

    
por mathemagician 02.02.2013 / 10:00
21

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

cp -rv old-directory new-directory
    
por Ubuntourist 14.12.2010 / 18:17
17

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

mostrapeed de link 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)
...
    
por Jürgen Weigert 25.02.2014 / 15:34
11

Embora pv possa lidar com as tarefas locais cp , usar dd com pv pode lidar com tarefas locais ( cp ) e remotas ( scp ).

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

Verifique se path/to/dest.mkv sai 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

Substitua 100M acima pelo tamanho real do seu arquivo de origem.

Aqui vem a parte remota

Embora scp dificilmente mostre o progresso atual, usar dd com pv é muito fácil.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
    
por onemach 05.01.2013 / 09:08
9

Existe uma nova ferramenta chamada cv que pode encontrar qualquer descritor relacionado a um comando em execução e mostrar o progresso e a velocidade: link

cv -w

mostra as estatísticas de todas as operações em cp, mv etc.

    
por naugtur 13.07.2014 / 13:33
9

Existe uma ferramenta chamada progress nos repositórios que é capaz de examinar vários comandos diferentes e exibir informações de progresso para eles.

Instale-o usando o comando

sudo apt-get install progress

Esta ferramenta pode ser usada assim:

cp bigfile newfile & progress -mp $!

Saída:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)
    
por Nathaniel A Malinowski 27.09.2016 / 00:35
6

Como muitos disseram, o cp não inclui essa funcionalidade.

Só para jogar $ 0,02, o que geralmente faço com situações triviais de cópia (ou seja, sem -R ):

  1. Veja o tamanho do arquivo e lembre-se

  2. Comece a copiar

  3. Abra outro terminal

  4. Execute watch ls -lh DIR no diretório em que o destino é

Isso pode me manter atualizada no tamanho do arquivo de destino, com um mínimo de problemas.

Como uma alternativa para situações menos triviais, por exemplo copiando recursivamente os diretórios, você pode usar watch du -hs DIR para ver o resumo do tamanho da DIR. No entanto du pode demorar muito para computar e pode até retardar a cópia, então você pode querer usar o argumento -n INTERVAL para observar, para que o trade-off seja aceitável.

Atualização: Caso você use curingas com o comando usado com watch du, por exemplo watch du -hs backup/* , não se esqueça de citar:

watch "du -hs backup/*"

caso contrário, os curingas serão expandidos somente uma vez , quando o watch for iniciado para que du não olhe para novos arquivos / subdiretórios.

    
por Alois Mahdal 16.11.2012 / 14:20
4

dd status=progress

Opção adicionada no GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

O Stdout é uma linha atualizada periodicamente, como:

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

Veja também: Como você monitora o progresso do dd?

    
2

Use um script de shell:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "" "" 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' "") count=0
}

Isto será parecido com:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

Fonte

    
por Jan 01.09.2014 / 15:45
2

Dependendo do que você deseja fazer, o Midnight Commander ( mc ) pode ser a resposta. Estou surpreso que não tenha sido mencionado ainda.

Ferramentas como pv ou rsync são boas para exibir o progresso da transferência de um arquivo enorme, mas quando se trata de copiar diretórios / árvores inteiros, mc calcula o tamanho e exibe o progresso muito bem. Além disso, está disponível imediatamente na maioria dos sistemas.

    
por kralyk 30.01.2016 / 18:33
2

Se você tiver o rsync 3.1 ou superior ( rsync --version ), poderá copiar (cp -Rpn) preservando as permissões e a propriedade, recriar diretórios, "no clobber" e exibir o progresso geral (em vez de apenas progredir por arquivo) , taxa de cópia e tempo estimado (muito aproximado) restante com:

sudo rsync -a --info=progress2 --no-i-r /source /destination

Note que o sudo só é necessário se estiver lidando com diretórios / arquivos que você não possui. Além disso, sem o --no-i-r , o percentual pode redefinir para um número menor em algum momento durante a cópia. Talvez versões posteriores do rsync sejam padronizadas como no-i-r com info = progress2, mas isso não acontece na versão atual do 3.1.2.

Descobri que a porcentagem e o tempo restantes são superestimados quando copiados para um diretório que já contém arquivos (por exemplo, quando você normalmente usaria cp -n "no clobber").

    
por S Lentz 02.03.2016 / 23:22
0

Você pode copiar qualquer programa. Ao mesmo tempo, você pode iniciar sudo iotop e ver a velocidade real de leitura / gravação do disco sem progredir.

    
por McKelvin 11.01.2018 / 16:47