É possível ver a velocidade do cp e a porcentagem copiada?

251

Estou tendo problemas ao copiar arquivos grandes usando o nautilus (ele fica preso). Eu preciso copiar, usando cp. Gostaria de saber se existem parâmetros que mostram o% copiado e também a velocidade de transferência.

yzT
fonte
39
Você poderia usar em rsyncvez de cp. Tem uma --progressopção
Frostschutz
2
Midnight Commandertambém funciona bem e possui uma interface de usuário bonita baseada em texto com barras de progresso, mas pode não estar instalada. Tente mcno prompt de comando. Além disso, obviamente, não é cp.
um CVn 17/02
3
Usar rsynccom --progressapenas me fez descobrir o que está acontecendo. Ele fica preso quando atinge os 100% e, em seguida, dura alguns minutos. Eu acho que é o mesmo que está acontecendo com o nautilus. De qualquer forma, essa já é outra questão; portanto, a melhor resposta para essa pergunta é rsync --progress: mostra tamanho,%, velocidade e tempo decorrido.
yzT 17/02
2
Um problema com o rsync é que ele é executado mais lentamente que uma cópia pura. No meu grande servidor, a diferença é de 60 MB / se 300 MB / s, respectivamente.
Pdwalker #
1
@pdwalker mesmo com a -Wopção? em todos os meus hosts rsyncé quase tão rápido quanto cp... tão perto que uso regularmente em rsyncvez de cp.
Skaperen

Respostas:

193

rsynctem um sinalizador chamado progress2que mostra a porcentagem geral:

rsync --info=progress2 source dest
yzT
fonte
5
--info = progress2 ainda não o transformou em um repositório padrão e aqui está 2015. Parece uma boa idéia.
Lonniebiz
1
--info=progress2finalmente incluído version 3.1.0 protocol version 31. Talvez você possa editar sua resposta, yzT.
Sopalajo de Arrierez
1
Percebi --info=progress2que o rsync está super rápido! 200 MB / s, enquanto o Windows não vai além de 90 MB / s!
ReneFroger
1
@ReneFroger, embora essa possa ser a velocidade real (dependendo do dispositivo), geralmente no Linux essa velocidade é realmente falsa e, após a conclusão da cópia, o sistema ainda está gravando no dispositivo, ao contrário do Windows em que você pode ejetar o dispositivo quase imediatamente. Se você copiar arquivos grandes, poderá observar como ele começa nessa velocidade rápida, mas diminui até o padrão.
yzT 29/06
7
funcionou para mim com apenas --progress. rsync versão 3.0.9
adrianTNT
103

Se você permitir outras ferramentas que cpnão sejam certamente possíveis. Para um único arquivo você pode usar pv. É uma pequena ferramenta que fornece estatísticas agradáveis.

pv inputfile > outputfile

Se você possui vários arquivos ou diretórios, pode usar o tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Você pode envolvê-lo em uma função shell. É menos para digitar e você obtém semânticas próximas das de cp. Aqui está uma função muito simples (e não à prova de erros!):

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

Observe que algumas versões tardo não suportam a sintaxe mencionada (por exemplo, Solaris tar) e você deve usar a seguinte variante:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

Você chama assim

cpstat sourceDirectory destinationDirectory

Você pode aprimorá-lo ainda mais, para pvfornecer uma estimativa do tempo restante.

Outra solução (como frostschutz mencionado em um comentário) é usar o rsync com a --progressopção:

rsync --progress -a sourceDirectory destinationDirectory
Marco
fonte
1
O cpstat está indo no pastebin =) #
Matt #
7
Isso lhe dará velocidade de transferência, mas não o ETA, porque pvnão sabe quantos dados serão enviados pelo canal. Você pode especificar isso usando -s. Por exemplo, primeiro fazer du -sh sourceDirectorypara ter uma idéia (áspero), e, em seguida, passá-lo para pv, assim: pv -s 100m.
Jan Fabry
1
--info = progress2 fornece estatísticas de progresso no nível do diretório.
AlexLordThorsen
vbuf(debian, ubuntu) é um pouco mais rápido que pv, provavelmente por causa de seu buffer de anel virtual
Skaperen
@ Skaperen eu não sei vbuf. Mas, como parece, o Debian é instável no momento e, portanto, frequentemente não está disponível em servidores que normalmente executam o Debian stable.
Marco
58

rsync funciona melhor para mostrar o progresso durante o processo de cópia.

ex:

rsync -avh --progress sourceDirectory destinationDirectory
JustStoppingThrough
fonte
27

Conforme explicado em outras respostas, o cp não fornece essa funcionalidade. No entanto, o progresso (anteriormente chamado cv) é uma pequena ferramenta que é muito útil para fornecer esse recurso ausente.

Essa ferramenta pode ser descrita como um comando Tiny Dirty Linux Only * C que procura os comandos básicos do coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ...) atualmente em execução no sistema e exibe a porcentagem de cópias dados.

Eu tenho usado nos últimos meses e é sólido.

Amr Mostafa
fonte
parece não funcionar com todos os sistemas de arquivos (por exemplo, CIFS), mas um, não sabia como louco ting sai
akostadinov
1
Observe que este projeto agora é chamado de "progresso - Coreutils Progress Viewer (anteriormente conhecido como cv)".
Chappjc
17

É possível ver a velocidade do cp e a porcentagem copiada?

Sim, é possível exibir o progresso do comando cpno terminal.


Método # 1: (uso progress)

Abra um novo terminal e digite: progressele exibirá o progresso do cpcomando e outros comandos, como:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

Se você não tiver instalado progress, você pode instalá-lo a partir do repositório, por exemplo, no CentOScom este comando: yum -y install progress.

Depois que você executar o cpcomando em segundo plano ou depois da execução cpnormal, abra outro terminal, então tente este comando:

# progress -m

Veja a saída:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

Método # 2: (use o patch cp)

Ou faça o download do GNU coreutilse corrija-o.

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

Corre:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Copie os dois arquivos cpe mvloacated sob coreutils-8.21/src/a /usr/local/bin:

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

Ou copie-o usando o gerenciador de arquivos como root

Adicione as seguintes linhas ao seu ~/.bashrc:

alias cp='cp -gR'
alias mv='mv -g'

Logout e Login

A barra de progresso pode ser exibida sem o –gou –progress-barconforme recomendado pelo autor

Veja a saída:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

Fonte: linuxhelp

GAD3R
fonte
1
Este parece ser a verdadeira fonte do cppatch: web.archive.org/web/20131115171331/http://beatex.org/web/...
Kaushal Modi
1
+1 para o dica sobre progresscomando
Peter
esta é a única resposta real
Alessio
14

Percebeu que essa postagem era um pouco antiga. Mas, como fiz uma solução para o problema em questão, pensei em publicar minha solução.

Cenário: Como temos uma estrutura de diretórios muito grande que queremos copiar, emitimos o comando cp -R sourcedir destdir em uma janela do terminal.

Abra outra janela do terminal ou coloque o processo em segundo plano (Ctrl+Z,bg<CR>), então vamos fazer um indicador de progresso da maneira do gueto:

Primeiro obtemos o tamanho total da estrutura de diretórios que queremos copiar; você faz isso com:

du -sh /path/sourcedirectory/

Converta o resultado em gigabytes (G) e, em seguida, substitua n pelo resultado obtido na variável sourceize. Depois de inserir o sourcesize e o destdir (diretório de destino), execute o comando abaixo.

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

Isso imprimirá o progresso a cada 10 segundos com mensagens como:

0.100% completed
0.200% completed
0.300% completed 
... etc

Estou ciente de que esta solução não abordou a velocidade da cópia, mas seria possível adicionar isso expandindo os comandos acima, possivelmente transformando-o em um script bash para facilitar a leitura. Por exemplo, verificando a quantidade de dados copiados por pr. Na unidade de tempo, a velocidade deve ser trivial para calcular e exibir.

NordicViking
fonte
Isso é realmente perfeito para o meu caso de uso, então obrigado por publicá-lo! Quero saber sobre o progresso de copiar um diretório enorme com milhares de arquivos, não apenas um, para que as outras soluções não me ajudem.
Ibrahim
Isso é ótimo, especialmente em casos como o que estou enfrentando agora: remotamente, iniciei um enorme trabalho de MV para mover terrabytes de backups de um pool de armazenamento para outro, sem pensar nas implicações de antemão. Agora eu posso facilmente colocar o processo em segundo plano e dar uma espiada nele. Impressionante!
Riley
8

Para melhorar a resposta de Marco, hoje escrevi esta versão do cpstat, para que você possa copiar muitos diretórios e usar o último parâmetro como o caminho de destino. Observe que, se você usar um caminho profundo relativo como fonte, poderá, graças a tar, criar automaticamente a mesma árvore de diretórios dependente.

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}
poe84it
fonte
6

Não está em uma versão padrão do cp.

Você pode colocar em segundo plano o cp e listar o tamanho enquanto aguarda cpa conclusão.

Eu uso esse perl para monitorar o crescimento de um único arquivo, mas ele é executado externamente no cp (ou o que mais eu estiver fazendo)

Matt
fonte
5

Apesar de rsyncfornecer algumas estatísticas de progresso, se você quiser uma barra de progresso, use pv.

Você pode usar cpvum wrapper para pvuma sintaxe mais fácil, mais semelhante à cpque você pode usar para copiar recursivamente diretórios

insira a descrição da imagem aqui

Você pode obtê-lo aqui

nachoparker
fonte
+1 para a dica ativada pv. Bom achado!
Peter
4

Usar uma ferramenta como mc(comandante da meia-noite) pode ser uma boa opção alternativa para outras respostas.

É um gerenciador de arquivos simples que mostra você copiar / mover o progresso.

jseals
fonte
4

dd status=progress

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

dd if=src of=dst status=progress

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? | Ask Ubuntu

Ciro Santilli adicionou uma nova foto
fonte
4

Outra solução simples é apenas observar a pasta de saída da seguinte maneira:

Linux / Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

Este utilitário prático será executado due destacará as diferenças.

Uma outra solução em potencial seria escrever um script simples que faça um loop, chamando due cuspindo uma estimativa aproximada da taxa de transferência.

Timothy C. Quinn
fonte
3

Essa ferramenta é um comando do utilitário Linux que procura os comandos básicos do coreutils (cp, mv, dd, tar, gzip / gunzip, cat etc.) atualmente em execução no sistema e exibe a porcentagem de dados copiados:

https://github.com/Xfennec/cv

saidi
fonte
1
Isso já foi sugerido por @AmrMostafa em nov '14.
Dubu
2

Acabei de ter um caso em que o cp estava mais ou menos bloqueado devido a um bug do FUSE no sistema de arquivos receptor.

Se você não pode simplesmente mudar do cp (ou seja, porque --sparse = always) e quer algo que seja realmente confiável para o progresso, vá por / proc.

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0
Florian Heigl
fonte
0

VCP - copia arquivos em uma interface de maldições (Mostrar a barra de progresso no Linux).

DESCRIÇÃO: vcp copia arquivos e diretórios em uma interface de maldições, com apenas texto disponível. suas opções e saída são semelhantes ao cp do BSD ao adicionar alguns novos recursos.

Ele fornece informações sobre:

  • arquivos copiados e deixados para copiar
  • dados gravados e tamanho total dos dados
  • dados sendo gravados a cada segundo
  • duas barras de status, uma mostrando o status atual do arquivo, o outro status total (exceto com 1 arquivo, ambos mostram o atual) e porcentagem

quando a saída é enviada ao console:

  • uma barra de status
  • tamanho copiado e velocidade

Página do manual da VCP: https://linux.die.net/man/1/vcp

Faça o download de vcp-2.2.tar.gz em:

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

Dependência: curses.h (libncurses-dev).

No Ubuntu, instale:

sudo apt-get install libncurses-dev

ou

sudo apt-get install libncurses5-dev

INSTALAR vcp:

make && make install

Manual:

man vcp
user350351
fonte