Ao mover diretórios grandes usando mv
, existe uma maneira de visualizar o progresso (%)? O cp
comando no gentoo tinha uma -g
opção que mostrava o progresso.
Ao mover diretórios grandes usando mv
, existe uma maneira de visualizar o progresso (%)? O cp
comando no gentoo tinha uma -g
opção que mostrava o progresso.
Respostas:
Você pode criar um cp e mv com patches, os quais suportam a opção -g para mostrar o progresso. Existem instruções e correções nesta página . No entanto : a página instrui você a fazer
$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv
que substitui o cp e o mv originais. Isso tem duas desvantagens: primeiro, se um pacote coreutils atualizado chegar ao seu sistema, eles serão substituídos. Em segundo lugar, se a versão corrigida tiver um problema, eles poderão interromper os scripts que dependem do cp e mv padrão. Prefiro fazer algo assim:
$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg
que copia os arquivos para / usr / local / bin, destinado aos programas compilados pelo usuário, e fornece um nome diferente. Então, quando você quer uma barra de progresso, diz mvg -g bigfile /mnt/backup
e usa mv normalmente.
Além disso, você pode fazer alias mvg="/usr/local/mvg -g"
isso, basta dizer mvg bigfile /mnt/backup
e obter diretamente a barra de progresso.
Não gosto da idéia de substituir binários do coreutil quando houver soluções mais simples, então aqui estão as minhas:
rsync : o Rsync copia arquivos e possui uma -P
opção para uma barra de progresso. Portanto, se você tiver o rsync instalado, poderá usar um alias simples em seu shells dotfile:
alias cp='rsync -aP'
A desvantagem é que o rsync é um pouco mais lento que o cp, mas você deve medir isso com o tempo e decidir por si próprio, eu posso viver com ele :-)
Script de shell : um script de shell também pode criar a barra de progresso. Eu encontrei isso há um tempo atrás na rede e não me lembro da fonte:
#!/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% [===============================> ]
bar :
'bar' - 'cat' com barra de progresso ASCII
bar
é um pequeno script de shell para exibir uma barra de processos para todos os tipos de operações (cp, tar, etc.). Você pode encontrar exemplos na página inicial do projeto.
Também é escrito para a casca de bourne, por isso funcionará nas proximidades em qualquer lugar.
bar
ainda não quebra mv
.
rsync
não substitui mv
(o OP está perguntando) completamente, especialmente quando se trata de cópias rápidas em sistemas de arquivos de copiar em gravar como btrfs
.
Existe uma nova ferramenta chamada progress
que pode encontrar qualquer descritor relacionado a um comando em execução e mostrar progresso e velocidade:
disponível aqui
progress -w
gera estatísticas para todas as operações cp, mv etc. em execução
progress
após a instalação e ele me apresentou o progresso do mv
comando que eu estava esperando no momento. Obrigado!
sudo
(mesmo usuário eu acho) - você também pode usar watch
para dizer o que está acontecendo a cada 2 segundos:watch progress -w
watch progress -w
você também pode simplesmente usarprogress -m
Você pode usar o comando visualizador de tubulaçãopv
para mostrar a barra de progresso:
pv /original/file > /new/file
Costumo usar isso para copiar um arquivo grande em um sistema de arquivos de rede montado (combinar com gzip
e tar
). A desvantagem é que você pode copiar apenas um arquivo e não o diretório. E você deve dar um nome ao novo arquivo, não pode apenas dar o diretório de destino como cp
faz. No entanto, copiar não pv
é o objetivo. É uma ferramenta poderosa e faz muito mais do que apenas copiar arquivos. Veja a página inicial para mais exemplos de pv
.
Uma opção muito melhor é usar rsync -aP
. Se desejar mv
, acrescente a bandeira --remove-source-files
. Adicione isso ao seu .bashrc
se desejar usar os comandos com freqüência:
alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'
A desvantagem aqui é que o rsync mostra apenas o progresso, não uma barra de progresso.
tar cf - source-dir | pv | tar xf - -C out-dir
fornecerá o rendimento de um diretório inteiro. Se você conhece o tamanho e passa -s
para pv, também pode progredir.
Se seu objetivo é mover / copiar um diretório com barra de progresso, mas evitando a GUI não terminal, o mc (Midnight Commander) é uma boa opção.
Minha solução é usar rsync
. Ele pode copiar diretórios, remover os arquivos de origem após uma cópia bem-sucedida (assim "movê-los") e exibir relatórios de progresso, entre muitos outros recursos (principalmente a sincronização de diretórios parcialmente copiados e o trabalho na rede).
Aqui está como eu moveria um diretório com o rsync, com o relatório de progresso:
rsync -aP --remove-source-files $src $dst && rm -r $src
Certifique-se de $src
que não termine com uma barra invertida, caso contrário, você terá um significado diferente do GNU cp
.
O rm -r
final é necessário porque --remove-source-files
apenas remove os arquivos de origem, depois que cada um é copiado com êxito, não os diretórios. O &&
certifica-se de executá-lo somente se o rsync for concluído com êxito. Se você é paranóico, pode substituí-lo por algum tipo de recursiva rmdir
, comofind $src -d -exec rmdir {} +
A única falha é que a -P
opção mostra o progresso de cada arquivo, não de toda a operação de cópia. Isso pode ser inútil se você estiver tentando mover um diretório com muitos arquivos minúsculos. A versão de desenvolvimento mais recente do rsync possui um sinalizador alternativo --info=progress2
que mostra o progresso de toda a operação.
Para evitar coreutil patch para adicionar barra de progresso para mv
e cp
, gcp
(copiador de Goffi) é uma nova alternativa: http://wiki.goffi.org/wiki/Gcp/en
Usar da mesma maneira que cp
nas opções -r
de recursividade e -v
verbosidade.
Ele usa uma fila de arquivos quando vários comandos são invocados simultaneamente. Ele também permite gravar nomes de arquivos copiados em um log; consulte a seção Página de manual de economia de fonte para obter detalhes.
Aqui está um bom tutorial para começar gcp
: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/
Primeiro: nunca copio arquivos grandes sem usar o ionice, a menos que saiba que não desejarei usar o computador por meia hora ou mais.
Segundo: todas as minhas partições estão organizadas, de modo que a cópia intrapartição não leva tempo. Se for uma cópia longa, faço um du -sm
nos arquivos e df -m | grep copy_to_partition
. Então, se estiver curioso quanto tempo levará, eu faço df
novamente e vejo quanto dos arquivos foram copiados.
No meu Mint, eu gosto de usar o gcp nesta ou na solução curl (o que é muito bom)
gcp SOURCE DESTINATION
Pode ser necessário instalá-lo sudo apt-get install gcp
E uma tarefa muito agradável e excelente para a barra de progresso com informações sobre
em um bom formato legível é:
curl -o DESTINATION FILE://source
Além disso, pode ser necessário instalá-lo primeiro sudo apt-get install curl
gcp
não suporta a movimentação de arquivos, ou seja, os arquivos de origem precisam ser removidos manualmente após a cópia bem-sucedida.
Isso não fornece uma barra de progresso, mas pressione CTRL-T
e você enviará um SIGINFO
para mv
, que informará em qual arquivo está trabalhando e qual o andamento do processo. É bastante útil ter isso para grandes transferências de arquivos, possivelmente não tão útil para uma transferência com muitos arquivos pequenos.
Exemplo rápido:
mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08 cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf 68%
INFO: unknown signal; killall -l lists signals.
que o SIGINFO é apenas em alguns BSDs, não no POSIX padrão.
Use mv -v
para imprimir uma linha por arquivo movido e pv -l
para imprimir o progresso com base na contagem de linhas (na contagem de arquivos com efeito).
Você precisará pv
(visualizador de tubulação): http://www.ivarch.com/programs/pv.shtml
mv -v sourcedir targetdir | pv -l -s filecount > logfile
Use o seguinte comando para obter a contagem de arquivos:
find sourcedir | wc -l
Este comando mostrará informações de progresso com base no número de arquivos copiados. Isso funciona melhor se houver muitos arquivos pequenos. Se houver apenas alguns arquivos enormes, você não se divertirá muito.
Observe que mv
na mesma partição deve ser rápida. mv
para outra partição seria o mesmo que cp source target
seguido por rm source
. Então, aqui estão dois comandos para copiar diretórios com informações de progresso.
para relatar o progresso com base no número de arquivos copiados:
cp -av sourcedir targetdir | pv -l -s filecount > logfile
para relatar o progresso com base nos bytes copiados:
tar c sourcedir | pv -s size | tar x -C targetdir
Veja aqui para mais detalhes: informações de progresso via pv para cópia do diretório
Invariavelmente, acabo procurando por essa resposta depois de iniciar o comando 'mv', quando não quero iniciá-lo novamente. Se você estiver nessa situação, uma maneira muito simples de monitorar o progresso (ou para ver se está longe o suficiente para que não valha a pena matar) é executar:
du -hs /directory/you're/moving/data/to
Isso imprimirá apenas o tamanho do diretório para que você possa ver quantos dados foram copiados ou execute-o algumas vezes para ver a velocidade com que os dados estão sendo transferidos.