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

326

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

Olivier Lalonde
fonte

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.

Stefano Palazzo
fonte
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)
bartekbrak
fonte
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.


fonte
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.

matemático
fonte
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
Ubuntourist
fonte
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)
...
Jürgen Weigert
fonte
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)
Nathaniel A Malinowski
fonte
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
onemach
fonte
1
Mais recente ddtem status=progress: askubuntu.com/a/824895/52975
Ciro Santilli新疆改造中心法轮功六四事件
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

naugtur
fonte
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.

Alois Mahdal
fonte
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?

Ciro Santilli adicionou uma nova foto
fonte
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").

S Lentz
fonte
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

Jan
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.

kralyk
fonte
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.

ciekawy
fonte
-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.

McKelvin
fonte
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

KIRAN B
fonte
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] [     <=>                                                                   ] 
alecail
fonte