ti-enxame.com

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

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

129
letronje

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 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 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 baseados no cp e no 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, você diz mvg -g bigfile /mnt/backup e use mv normalmente.

Também você pode fazer alias mvg="/usr/local/mvg -g" então você só precisa dizer mvg bigfile /mnt/backup e obtenha diretamente a barra de progresso.

50
fschmitt

Não gosto da ideia 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 um -P mude 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 do Shell : Um script do 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% [===============================>                      ]

barra :

"Barra" - "gato" com ASCII

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

Também é escrito para a bourne Shell, por isso funcionará nas proximidades em qualquer lugar.

96
echox

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

92
naugtur

Você pode usar visualizador de canal comando 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 (combinado com gzip e tar). A desvantagem é que você só pode copiar um arquivo e não o diretório. E você deve dar um nome ao novo arquivo, você não pode apenas dar o diretório de destino como cp faz. No entanto, copiar não é o objetivo de pv. É 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 você desejar mv, adicione o sinalizador --remove-source-files. Adicione isso ao seu .bashrc se você deseja 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.

36
Lamnk

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.

6
Christian Madsen

Minha solução é usar rsync. Ele pode copiar diretórios, remover os arquivos de origem após uma cópia bem-sucedida ("movendo-os") e exibir relatórios de progresso, entre muitos outros recursos (principalmente sincronizar diretórios parcialmente copiados e trabalhar 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

Certificar-se de que $src não termina em uma barra invertida; caso contrário, você terá um significado diferente do significado de 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ê é paranóico, pode substituí-lo por algum tipo de rmdir recursivo, como find $src -d -exec rmdir {} +

A única falha é que o -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 mais recente de desenvolvimento do rsync tem um sinalizador alternativo --info=progress2 que mostra o progresso de toda a operação.

4
Tobia

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

2
HandyGandy

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%
2
Charles

No meu Mint, eu gosto de usar o gcp nesta ou na solução curl (o que é realmente legal)

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 formato legível agradável é:

curl -o DESTINATION FILE://source

Além disso, pode ser necessário instalá-lo primeiro Sudo apt-get install curl

2
ThePentadactyl

Para evitar o patch do coreutil para adicionar uma barra de progresso a mv e cp, gcp (CoPier de Goffi) é uma nova alternativa: http: //wiki.goffi. org/wiki/Gcp/pt

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 log, consulte a seção da página de manual Saving da fonte para obter detalhes.

Aqui está um bom tutorial para começar com gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

2
Yves Martin

Usar 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á de pv (visualizador de canal): 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

1
lesmana

Invariavelmente, acabo procurando por esta resposta depois Eu inicio 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.

1
qazmonk

Eu uso o seguinte script salvo com rsmv name:

#!/usr/bin/env bash

rsync -aP --remove-source-files "[email protected]" && rm -rf "${@:1:$#-1}"

Ele lida com mais de uma fonte e nomes de arquivos com espaços em branco:

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel