rsync
tem um sinalizador chamado progress2
, que mostra a porcentagem geral:
rsync --info=progress2 source dest
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 mostrem o% copiado e também a velocidade de transferência.
Se você permitir outras ferramentas além de cp
, certamente é possível. Para um único arquivo, você pode usar pv
. É uma pequena ferramenta que fornece boas estatísticas.
pv inputfile > outputfile
Se você tem vários arquivos ou diretórios, você pode usar tar:
tar c sourceDirectory | pv | tar x -C destinationDirectory
Você pode envolvê-lo em uma função de shell. É menos para digitar e você obtém semânticas próximas às 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 de tar
não suportam a sintaxe mencionada acima (por exemplo, Solaris tar
) e você precisa usar a seguinte variante:
cpstat () {
tar cf - "$1" | pv | (cd "$2";tar xf -)
}
Você chama assim
cpstat sourceDirectory destinationDirectory
Você pode melhorar ainda mais, para que pv
forneça uma estimativa do tempo restante.
Outra solução (como frostschutz mencionada em um comentário) é usar o rsync com a opção --progress
:
rsync --progress -a sourceDirectory destinationDirectory
rsync
funciona melhor para mostrar o progresso durante o progresso da cópia.
ex:
rsync -avh --progress sourceDirectory destinationDirectory
Como 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.
This tool can be described as a Tiny Dirty Linux Only* C command that looks for coreutils basic commands (cp, mv, dd, tar, gzip/gunzip, cat, ...) currently running on your system and displays the percentage of copied data.
Eu tenho usado isso nos últimos meses e é sólido.
Notou que essa postagem era um pouco antiga. Mas como eu fiz uma solução para o problema em questão, pensei em postar minha solução.
Cenário: Temos uma estrutura de diretórios muito grande que queremos copiar, então emitimos o comando cp -R sourcedir destdir em uma janela de terminal.
Abra outra janela de terminal ou envie o processo para o plano de fundo (Ctrl+Z,bg<CR>)
, então vamos fazer um indicador de progresso no caminho 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 o n pelo resultado obtido na variável sourcesize. Depois de inserir o sourceize 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 essa solução não abordou a velocidade da cópia, mas seria possível adicionar isso expandindo os comandos acima, possivelmente tornando-a um script bash, para facilitar a leitura. Por exemplo, verificando quantos dados são copiados pr. Na unidade de tempo, a velocidade deve ser trivial para calcular e exibir.
Is it possible to see cp speed and percent copied?
Sim, é possível exibir o progresso do comando cp
no terminal.
progress
) Abra um novo terminal e digite progress
, ele exibirá o progresso do comando cp
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 instalou o progress
, poderá instalá-lo a partir do repositório, por exemplo, no CentOS
com este comando: yum -y install progress
.
Em seguida, depois de executar o comando cp
em segundo plano ou depois de executar cp
normalmente, 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
cp
) Ou faça o download do GNU coreutils
e 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
Executar:
export FORCE_UNSAFE_CONFIGURE=1
./configure
make
Copie os dois arquivos cp
e mv
loacated em coreutils-8.21/src/
to /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 –g
ou –progress-bar
conforme 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 %
Para melhorar a resposta do Marco, hoje eu escrevi esta versão do cpstat
, então você pode 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 origem, você 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 - )
;}
Não em uma versão padrão de cp
.
Você pode colocar em segundo plano o cp e listar o tamanho enquanto aguarda que cp
termine.
Eu uso este perl para monitorar o crescimento de um único arquivo, mas ele é executado externamente para o cp (ou o que for mais eu estou fazendo)
Eu achei isso para usar, funcionou muito bem:
sudo watch lsof -p'pgrep -x cp'
de um comentário de Mike sobre a questão como verificar o progresso da execução do cp
Outra solução simples é apenas observar a pasta de saída da seguinte forma:
watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>
Este utilitário prático executará du
e destacará as diferenças.
Uma outra solução potencial seria escrever um script simples que faça um loop, chamando du
e cuspindo uma estimativa aproximada da taxa de transferência.
Usar uma ferramenta como mc
(midnight commander) pode ser uma boa opção alternativa para outras respostas.
É um gerenciador de arquivos simples que mostra o progresso da cópia / movimentação.
Esta ferramenta é um comando do utilitário Linux que procura por 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:
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? | Pergunte ao Ubuntu
Acabei de ter um caso em que o cp estava mais ou menos bloqueado devido a um bug do FUSE no sistema de arquivos de recebimento.
Se você não pode simplesmente mudar de cp (ou seja, porque --sparse = sempre) e quer algo que é realmente confiável para o progresso, vá em / 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
Tags cp