Como posso mover arquivos e visualizar o progresso (por exemplo, com uma barra de progresso)?

118

Ao mover diretórios grandes usando mv, existe uma maneira de visualizar o progresso (%)? O cpcomando no gentoo tinha uma -gopção que mostrava o progresso.

letronje
fonte
3
Medir o throughput tubo na concha pode ajudar, embora eu não sei se é possível facilmente usar essas ferramentas quando mover um ficheiro
Michael Mrozek

Respostas:

50

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/backupe usa mv normalmente.

Além disso, você pode fazer alias mvg="/usr/local/mvg -g"isso, basta dizer mvg bigfile /mnt/backupe obter diretamente a barra de progresso.

fschmitt
fonte
2
Infelizmente, o patch nesta página não está mais presente e parece não ter sido indexado no arquivo da web. Parece haver muitos patches com nome e função semelhantes . Você poderia editar sua resposta para esclarecer qual deles queria dizer?
Gilles
Eu acho que o github.com/atdt/advcpmv é um sucessor válido e tem o mesmo patch, então mudei o link para apontar para ele.
Fschmitt
93

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 -Popçã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.

echox
fonte
3
barainda não quebra mv.
Tobu
5
Crédito para o shell script
Lamnk
11
Observe que rsyncnã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.
Karl Richter
74

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

naugtur
fonte
3
WOW, eu não esperava que isso fosse tão incrível! Eu simplesmente digitei progressapós a instalação e ele me apresentou o progresso do mvcomando que eu estava esperando no momento. Obrigado!
jredd
3
Obrigado! Ao mover coisas como raiz que parece que você tem que usar sudo(mesmo usuário eu acho) - você também pode usar watchpara dizer o que está acontecendo a cada 2 segundos:watch progress -w
Wilf
6
Programa incrível, mas ao mover, por exemplo, uma pasta com muitos arquivos, ele mostra apenas o andamento do arquivo atual, e não a pasta inteira no total. Em vez de watch progress -wvocê também pode simplesmente usarprogress -m
mxmlnkn 13/11/16
6
IMHO, esta é a maneira mais unix para resolver o problema. Em vez de aplicar patch em coreutils ou usar ferramentas que não são designadas para fins específicos (como rsync for mv) ou escrever scripts de overkilling, basta usar essa ferramenta escrita para o objetivo com amor.
Grief
34

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 gzipe 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 cpfaz. 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 .bashrcse 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.

Lamnk
fonte
tar cf - source-dir | pv | tar xf - -C out-dirfornecerá o rendimento de um diretório inteiro. Se você conhece o tamanho e passa -spara pv, também pode progredir.
Arantius
6

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.

Christian Madsen
fonte
3

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 $srcque não termine com uma barra invertida, caso contrário, você terá um significado diferente do GNU cp.

O rm -rfinal é necessário porque --remove-source-filesapenas 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 -Popçã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=progress2que mostra o progresso de toda a operação.

Tobia
fonte
2

Para evitar coreutil patch para adicionar barra de progresso para mve cp, gcp(copiador de Goffi) é uma nova alternativa: http://wiki.goffi.org/wiki/Gcp/en

Usar da mesma maneira que cpnas opções -rde recursividade e -vverbosidade.

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/

Yves Martin
fonte
Existe gmv como gcp para cp?
CodyChan #
Não encontrei equivalente. A propósito, não há necessidade de barra de progresso ao executar o "mv" em um único sistema de arquivos ... é bastante rápido. Se a movimentação for feita em dois sistemas de arquivos diferentes, ela será implementada como cp e, em seguida, remova a origem, se for bem-sucedida, ou remova o destino, se houver falha. Um script shell simples baseado em GCP podem fazê-lo corretamente (com uma primeira verificação para saber se origem e de destino são realmente em diferentes sistemas de arquivos)
Yves Martin
2

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 -smnos arquivos e df -m | grep copy_to_partition. Então, se estiver curioso quanto tempo levará, eu faço dfnovamente e vejo quanto dos arquivos foram copiados.

HandyGandy
fonte
Gostaria de compartilhar suas dicas de ionice? que prioridade você daria para mv cpu-wise e disk i / o-wise? Aqui estão as minhas configurações, mas a carga da CPU ainda é alta, mesmo após o renomeamento
ychaouche
2

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

  • % Total
  • % Recebido
  • % Xferd
  • DL médio
  • Upload rápido
  • Tempo restante
  • Tempo gasto
  • Tempo total
  • Velocidade atual

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

The Pentadactyl
fonte
gcpnão suporta a movimentação de arquivos, ou seja, os arquivos de origem precisam ser removidos manualmente após a cópia bem-sucedida.
Karl Richter
2

Isso não fornece uma barra de progresso, mas pressione CTRL-Te você enviará um SIGINFOpara 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%
Charles
fonte
11
Isso não funcionou para mim: entendi INFO: unknown signal; killall -l lists signals. que o SIGINFO é apenas em alguns BSDs, não no POSIX padrão.
Brian Minton
2
Direito. Funciona no Mac OS X, mas provavelmente não no Ubuntu, por exemplo.
Charles
1

Use mv -vpara imprimir uma linha por arquivo movido e pv -lpara 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 mvna mesma partição deve ser rápida. mvpara outra partição seria o mesmo que cp source targetseguido 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

lesmana
fonte
1

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.

qazmonk
fonte