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

103

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

    
por letronje 01.10.2010 / 08:11

12 respostas

46

Você pode construir um cp e mv com patches que suportam o switch -g para mostrar o progresso. Existem instruções e patches em esta 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 sobrescreve o cp e o mv originais. Isto tem duas desvantagens: primeiro, se um pacote coreutils atualizado chegar ao seu sistema, ele será sobrescrito. Em segundo lugar, se a versão corrigida tiver um problema, eles podem quebrar scripts que dependem de cp e mv padrão. Eu preferiria 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, que é destinado a programas compilados pelo usuário, e dá a eles um nome diferente. Então, quando você quer uma barra de progresso, você diz mvg -g bigfile /mnt/backup e usa mv normalmente.

Além disso, você pode fazer alias mvg="/usr/local/mvg -g" e só precisa dizer mvg bigfile /mnt/backup e obter diretamente a barra de progresso.

    
por 01.10.2010 / 09:17
86

Eu não gosto da idéia de sobrescrever binários do coreutil quando existem soluções mais simples, então aqui estão as minhas:

rsync : o Rsync copia arquivos e tem uma opção -P para uma barra de progresso. Então, se você tiver o rsync instalado, você pode usar um alias simples no seu dotfile shells:

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 mesmo, 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 net 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
}

Isto será parecido com:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

bar :

‘bar’ - ‘cat’ with ASCII progress bar

bar é um pequeno script de shell para exibir uma barra de processo para todos os tipos de operações (cp, tar, etc.). Você pode encontrar exemplos na página inicial do projeto

É também escrito para o shell bourne, por isso vai correr nas proximidades em todos os lugares.

    
por 01.10.2010 / 11:22
58

Há 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

mostra as estatísticas de todas as operações em cp, mv etc.

    
por 13.07.2014 / 13:36
31

Você pode usar o comando visualizador de canais pv 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 (combine com gzip e tar ). A desvantagem é que você só pode copiar o arquivo um e não o diretório. E você deve dar um nome ao novo arquivo, você não pode apenas fornecer o diretório de destino como cp . No entanto, copiar não é o propósito de pv . É uma ferramenta poderosa e faz muito mais do que apenas copiar o arquivo. Veja a página inicial para mais exemplos de pv .

Uma opção muito melhor é usar rsync -aP . Se você quiser mv , anexe o sinalizador --remove-source-files . Adicione isto ao seu .bashrc se você quiser usar os comandos com freqüência:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

A desvantagem aqui é que o rsync só mostra progresso, não uma barra de progresso.

    
por 26.06.2011 / 18:38
6

Se o seu objetivo é mover / copiar um diretório com a barra de progresso, mas evitando a GUI não terminal, o mc (Midnight Commander) é uma boa escolha.

    
por 28.05.2012 / 18:52
3

Minha solução é usar rsync . Ele pode copiar diretórios, remover os arquivos de origem depois de uma cópia bem sucedida (assim "movendo-os") e exibir relatórios de progresso, entre muitos outros recursos (mais notadamente sincronizando diretórios parcialmente copiados e trabalhando 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 que $src não termine em uma barra invertida, caso contrário, você terá um significado diferente daquele do GNU cp .

O rm -r no final é necessário porque --remove-source-files remove apenas 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ê é paranoico, pode substituí-lo por algum tipo de rmdir recursiva, como find $src -d -exec rmdir {} +

A única falha é que a opção -P mostra o progresso de cada arquivo, não da operação de cópia inteira. Isso pode ser inútil se você estiver tentando mover um diretório com muitos arquivos minúsculos. A última versão de desenvolvimento do rsync tem um sinalizador alternativo --info=progress2 que mostra o progresso de toda a operação.

    
por 15.02.2015 / 12:40
2

Para evitar o patch do coreutil para adicionar a barra de progresso a mv e cp , gcp (Goffi's CoPier) é uma nova alternativa: link

Para usar da mesma maneira que cp com as opções -r para recursividade e -v para 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 registro, consulte a seção de manual do Salvando man page para detalhes.

Este é um bom tutorial para começar a usar o gcp : link

    
por 07.01.2015 / 09:42
2
Primeiro: nunca copio arquivos grandes sem usar ionização, a menos que eu saiba que não vou querer usar o computador por meia hora ou mais.

Segundo: todas as minhas partições são divididas, então a cópia intrapartidária 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 curioso quanto mais tempo levará, eu faço o df novamente e ver o quanto dos arquivos foi copiado.

    
por 01.10.2010 / 17:18
2

No meu Mint eu gosto de usar o gcp nisso ou a curl-solution (que é realmente legal)

gcp SOURCE DESTINATION

Talvez seja necessário instalá-lo sudo apt-get install gcp

E uma tarefa muito boa e excelente para a barra de progresso com informações sobre

  • % total
  • % de recebimento
  • % Xferd
  • DL médio
  • Upload de velocidade
  • Tempo restante
  • Tempo gasto
  • Tempo total
  • Velocidade atual

em bom formato legível é:

curl -o DESTINATION FILE://source

Além disso, talvez seja necessário instalá-lo primeiro sudo apt-get install curl

    
por 25.12.2015 / 13:51
1

Isso não dá a você uma barra de progresso, mas pressione CTRL-T e você enviará um SIGINFO para mv , que informará em qual arquivo está trabalhando e em que medida está no processo. É muito útil ter isso para grandes transferências de arquivos, possivelmente não tão úteis 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%
    
por 16.06.2016 / 10:50
0

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 em efeito).

Você precisará do pv (visualizador de canais): link

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ápido. 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 sobre o progresso via pv para cópia de diretório

    
por 11.12.2016 / 12:57
0

Invariavelmente, eu acabo procurando por essa resposta depois eu inicio o comando 'mv', ponto no qual não quero iniciá-lo novamente. Se você está nessa situação, uma maneira muito simples de monitorar o progresso (ou para ver se está longe o suficiente, não vale a pena matar) é executar:

du -hs /directory/you're/moving/data/to

Isso apenas imprimirá o tamanho do diretório para que você possa ver quantos dados foram copiados ou poderá executá-lo algumas vezes para ver a rapidez com que os dados estão sendo transferidos.

    
por 19.12.2017 / 18:27