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


Respostas:


249

Embora cpnão tenha essa funcionalidade, você pode pvfazer 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 se você os tivesse criado e pertencerão a você.

Neste exemplo, pvbasicamente apenas envia o arquivo para stdout *, que você redireciona para um arquivo usando o> operador Simultaneamente, ele imprime informações sobre o progresso no 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% 

Pode ser necessário  instalar o pv (como alternativa sudo apt-get install pv) no seu sistema.


*: O bit técnico

Existem três fluxos de dados importantes em um sistema semelhante 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 redirecionamento redireciona a saída do programa para um arquivo. Sem argumentos, como você vê acima, >redireciona a saída padrão de um programa para um arquivo. cpbasicamente não faz nada mais sofisticado do que

cat source > destination

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

Dê uma olhada man pvpara saber mais sobre isso.


Outra opção, como sugere o texto alternativoDoR nesta resposta , é usar o rsync:

$ 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 mostra o progresso.


3
Ele pode ou não ser significativa (dependendo da situação), mas pvnão manipula permissões da mesma forma que cpfaz ... (com base em um teste rápido eu tentei: pvnão copiar o bit de execução em toda .. rsync. Fez
— Peter .O

45
IMO: alias cp="rsync -avz"cp está desatualizado.
— Marco Ceppi

11
Se você é como eu, e esquece pv, pode bisbilhotar /proc/PID of cp/fde /proc/PID of cp/fdinfodescobrir o progresso. (Depende de você inferir velocidade.) Eu uso essa técnica para assistir updatedb.
— Thanatos

11
Sim, -zprovavelmente só deve ser usado para cópias em rede; compactar e descompactar os dados para uma cópia local é pura sobrecarga.
— Matthew Leia

3
@MarcoCeppi, ao copiar o diretório, rsynccertifique-se de não adicionar à direita o /caminho de origem (ou remover se, por exemplo, a conclusão do bash o colocar automaticamente). Caso contrário, você obterá resultados diferentes dos do uso cp(ou gcp).
— Piotr Findeisen

185

Não existe. Veja aqui o porquê. Embora faça mais do que você precisa, rsyncpossui um --progressparâmetro O -amanterá permissões, etc, e -hserá legível por humanos.

rsync -ah --progress source destination

A saída será mais ou menos assim:

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)

4
Isso funciona muito bem no atual Ubuntu (14.10). Ele também suporta o -rsinalizador para recursar diretórios. Pode até ser um alias como um substituto direto para cp:alias cp="rsync -ah --progress"
— rustyx:

1
Funciona muito bem no OS X, com o bônus de poder usar as ferramentas incluídas no sistema.
— Ivan X

3
eu gosto mais desta alternativa do que o pv, principalmente porque o rsync faz parte da instalação padrão #
— 1913 João Joao Costa

1
@bartekbrak obrigado por compartilhar. Atualmente, estou no macOS 10.12.x executando a versão homebrew do rsync 3.1.2 e o uso --progressfaz minha cabeça girar 🙃, observando toda a saída exibida no terminal. Portanto, aqueles que vêm aqui das pesquisas de palavras-chave da AOL rsync -ah --info=progress2 [source] [destination] apresentam a saída de uma maneira um pouco mais saudável IM️ IMHO.
— Ipatch

2
Infelizmente, a saída não é muito útil ao copiar muitos arquivos pequenos.
— 24519 Raphael

89

Se você deseja ver se seus arquivos estão sendo transferidos corretamente, você pode usar gcpe gcpé como o cp, mas, por padrão, fornece uma barra de progresso para que você possa ver o que está sendo copiado. Como observa o wiki do programa , gcppossui 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)
  • registro de status de cópia: o gcp registra todas as suas ações para que seja possível saber quais arquivos foram copiados com sucesso
  • manipulação de nome 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 atingiu 100% ao usar a ferramenta, você deve esperar até que o prompt do terminal reapareça antes de remover a 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 tem opções como, --preservepara 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 entrando man gcpou acessando as páginas de manual do Ubuntu online . Um tutorial também está disponível neste site .

Instale a gcppartir 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 gcpcom a barra de progresso:

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

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


4
Erro ao dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
— instalar

3
se você tiver um monitor X11 aberto na máquina, basta configurar export DISPLAY=:0.0antes de iniciar o gcp. Se a máquina está sem cabeça, então você teria que começar um xsession em um framebuffer virtual ou algo, nesse ponto você provavelmente deve apenas olhar para outro programa
— user292067

2
gcpé bastante decente, mas o requisito DBUS / X é estranho. Eu lidei com isso através do SSH usando o encaminhamento ssh: ssh -X user@hoste isso me permitiu executá-lo.
— Oli

68

Eu recebo o pontapé do uso do cURL para esse fim exato. A página de manual 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.


1
Isso é ótimo, especialmente em ambientes onde você está proibido de instalar novas ferramentas e onde o rsync não está disponível.

5
Brilhante, isso deve ser um truque conhecido!
— ionreflex

Boa resposta! Esperto!
— 9301293

Este presumivelmente tem a mesma desvantagem como pv, que não irá poupar permissões.
— Ploni

1
Doce! alguma maneira de fazer isso funcionar para um diretório?
— Joseph Rajeev Motha 25/02

28

Embora não exiba velocidade, ao copiar vários arquivos, a -vopção do cpcomando fornecerá informações sobre o andamento. por exemplo

cp -rv old-directory new-directory

10
Informações de progresso? Esta é apenas uma saída detalhada. Para fornecer informações de progresso, você precisa pelo menos agora de quantos arquivos, ou mesmo de quais arquivos, precisam ser copiados.
— Julian F. Weinert

Ele mostra em qual arquivo está, o que pode ser suficiente em casos menos exigentes.
— Gringo Suave

20

O kernel conhece a maioria dos dados, como velocidade, e geralmente também porcentagem. Os kernels modernos expõem isso por meio do sistema de arquivos / proc.

showspeed de https://github.com/jnweiger/showspeed usa essas informações. 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)
...

Agradável. Como ele calcula porcentagens? Eu acho que apenas no caso de arquivos abertos como somente leitura? E provavelmente não funcionará em caso de acesso disperso.
— j_kubik

1
Nesse caso, você também pode usar outro terminal para executar pkill -USR1 ddpara ddmostrar o status, outra opção seria watch -n 1 pkill -USR1 ddmostrar o progresso periodicamente (a cada segundo).
— Yaron

Direito. Muitas ferramentas têm uma maneira integrada de relatar estatísticas ao longo do tempo. dd não é excepção. Implementações modernas têm uma opção status = progess. O Showspeed é uma solução clássica "uma ferramenta para uma finalidade" ao estilo unix - assim como o pv. Mas ele tem diferentes casos de uso: pense em xícaras bombeando um arquivo através do ghostscript ou você deseja conhecer o ETA para um cp ou tar em andamento. Pode ser que 95% já seja feito após algumas horas e você provavelmente não deseja reiniciar isso apenas para adicionar pv ... O acesso disperso não funcionaria bem. Showspeed apenas amostras procuram posições.
— Jürgen Weigert

18

Existe uma ferramenta chamada progressnos 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

Essa ferramenta pode ser usada assim:

cp bigfile newfile & progress -mp $!

Resultado:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)

12

Embora pvpossa lidar com cptarefas locais , o uso ddcom pvpode lidar com tarefas locais ( cp) e remotas ( scp).

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

Garanta as path/to/dest.mkvsaídas portouch 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 pelo tamanho real do seu arquivo de origem.

Aqui vem a parte remota

Embora scpdificilmente possa mostrar o progresso atual, usar ddcom 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

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 estatísticas para todas as operações cp, mv etc. em execução


watch cv -qé ainda mais puro
— nwgat

Ele mostra apenas o progresso de arquivos individuais, mas percebe se um cpestá copiando um diretório recursivamente ou não.
— Flimm 31/03

1
A guerra foi renomeada para progredir. Ótima ferramenta!
— sebastian

7

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

Apenas para jogar meus US $ 0,02, o que eu costumo fazer com situações triviais de cópia (ou seja, não -R):

  1. Veja o tamanho do arquivo e lembre-se

  2. Comece a copiar

  3. Abra outro terminal

  4. Execute watch ls -lh DIRno diretório em que o destino está

Isso pode me manter atualizado sobre o tamanho do arquivo de destino, com um mínimo de problemas.

Como alternativa para situações menos triviais, como copiar diretórios recursivamente, você pode usar watch du -hs DIRpara ver um resumo do tamanho do DIR. No entanto, du pode levar muito tempo para calcular e pode até atrasar a cópia, portanto, você pode querer usar-n INTERVAL argumento para assistir para que o trade-off seja aceitável.

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

watch "du -hs backup/*"

caso contrário, os curingas serão expandidos apenas uma vez , quando o relógio for iniciado, para que o du não veja novos arquivos / subdiretórios.


Não responder a parte "velocidade", embora ...
— Alois Mahdal

7

dd status=progress

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

dd if=src of=dst status=progress

O terminal mostra uma linha do tipo:

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

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


1
Você quis dizer: stdout é um fluxo de caracteres e seqüências de escape do vt100 que fazem o seu terminal exibir uma linha atualizada periodicamente;). stdout é sempre um fluxo de bytes e não tem nada a ver com a forma como ele é exibido (exceto que o aplicativo pode saber se ele está ligado a um terminal ou não ...)
— masterxilo

@masterxilo newbs não vai se importar, os especialistas vão saber ;-) hehe
— Ciro Santilli新疆改造中心法轮功六四事件

Bem, acho que é sempre bom afirmar as coisas como elas são, talvez deixando de fora alguns detalhes, mas nunca faça com que seus leitores produzam um modelo mental errado. Se você diz "stdout é uma linha (atualizada periodicamente)", parece que você está dizendo que stdout é um bloco de memória mutável que não é. É importante saber mesmo para iniciantes.
— masterxilo

6

Se você possui o rsync 3.1 ou superior ( rsync --version), pode copiar (cp -Rpn) enquanto preserva permissões e propriedade, recursa diretórios "no clobber" e exibe o progresso geral (em vez de apenas o progresso por arquivo), a taxa de cópia e ( muito aproximado) tempo estimado restante com:

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

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

Eu descobri que a porcentagem e o tempo restante são superestimados ao copiar para um diretório que já contém arquivos (ou seja, como quando você usaria cp -n "no clobber").


3

Use um script de 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
}

Será parecido com:

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

Fonte


3

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

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


2
"está disponível imediatamente na maioria dos sistemas". ... não em nenhuma instalação padrão do Ubuntu.
— muru

1

mais uma opção para preservar atributos (se sourcefor uma pasta na qual ela será criada destination)

tar -c source | pv -e -t -p -r | tar -C destination  -x

espero que possa ser útil para alguém. Para estimar o tempo de transferência, é possível obter isso do -s sourceantecipadamente e passando como -s <size>parâmetro para pv.


-f -é redundante. tarA saída ce entrada xpadrão de são stdout e stdin.
— Muru

Pode depender da versão do OS / tar? Eu sei que é um site Ubuntu ainda pode ser útil para outros proprietários de Sistemas Operacionais, como MacOS
— ciekawy

1
Não. Todas as implementações sãs (incluindo o tar da libarchive, que o macOS usa) têm esse comportamento.
— 19718 muru

acabou de verificar no macos e sua sugestão é perfeitamente válida - atualizei minha resposta. Obrigado!
— ciekawy

0

Você pode copiar usar qualquer programa. Ao mesmo tempo, você pode iniciar sudo iotope ver a velocidade de leitura / gravação do disco, sem progresso.


0

Verifique o código fonte para progress_bar no repositório git abaixo

https://github.com/Kiran-Bose/supreme

Experimente também o pacote de scripts bash customizado supremo

Baixe o arquivo deb e instale na distribuição baseada em debian ou baixe os arquivos de origem, modifique e use para outras distribuições

Visão geral da funcionalidade

(1) Aplicativos abertos ---- Firefox ---- Calculadora ---- Configurações

(2) Gerenciar arquivos ---- Pesquisar ---- Navegar ---- Acesso rápido

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Gerenciar telefone ---- Mover / copiar do telefone ---- Mover / copiar para o telefone ---- Sincronizar pastas

(4) Gerenciar USB ---- Mover / Copiar de USB ---- Mover / Copiar para USB


0

pv sabe como assistir descritores de arquivo dados um pid, seja cp ou outra coisa

A partir da documentação:

   (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

Exemplo:

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] [     <=>                                                                   ] 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.