informações de progresso via pv para cópia do diretório

13

Preciso copiar um diretório muito grande (falando em terabytes aqui) e quero monitorar o progresso.

Eu descobri que pvé um bom utilitário, mas como posso usá-lo para copiar diretórios recursivamente? ( pv src > dstnão funciona porque são diretórios)

PS: rodando no OS X Mountain Lion, pvfoi instalado a partir de portas Mac

FP
fonte

Respostas:

21

Usar rsync --progress [SRC] [DST]

Verifique a man rsyncpágina porque ela possui muitas opções muito úteis. -apara arquivamento é um bom começo, mas depende de seus requisitos exatos.

Copiar através de um canal atrasará desnecessariamente o processo de cópia, especialmente se for baseado em arquivos.

jippie
fonte
Por que copiar através de um tubo atrasaria o processo? O buffer fornecido por pipes e a multitarefa associada a pipes provavelmente ajudarão em questões que eu diria. (e o rsync é multiprocessos e usa tubos internamente IIRC). O que é um processo de cópia que não é baseado em arquivo?
Stéphane Chazelas
O Bash é conveniente, mas não rápido. Especialmente ao canalizar um comando para o outro.
jippie
@StephaneChazelas: porque o buffer de um tubo é de apenas 8 KB. Um programa como o rsync pode querer usar um buffer interno muito maior.
Zan Lynx
10

Você pode usar tarou paxou cpio:

mkdir -p dst &&
  (cd src && tar cf - .) | pv -trb | (cd dst && tar xpf -)
Stéphane Chazelas
fonte
1
Além disso, você pode adicionar um vao tarcomando para ver os nomes dos arquivos.
Peterph
Então, isso compactará a pasta de origem antes de fazer a cópia, certo? Minha pasta tem 5 TB de tamanho, então não tenho certeza se essa é a melhor maneira de fazer isso? Eu realmente gosto de usar o pv, pois mostra um status de progresso muito bom, algum conselho, por favor?
214 Tak
@ Tak, não, não zip nada, pois não há compressão. tar cf -gera um fluxo que contém os arquivos e seus metadados, que é alimentado por um canal para pv, que o alimenta intocado para o outro tarenquanto imprime uma indicação de progresso, e o outro tarextrai os dados nesse fluxo. Todos os três comandos são executados simultaneamente e processam os dados à medida que chegam, não há nada armazenado no disco, não há nada armazenado na memória além dos buffers de pipe e dos buffers internos dos comandos, que representam apenas alguns kilobytes.
Stéphane Chazelas
@ StéphaneChazelas Obrigado pelo comentário. Eu tentei e está funcionando, a única coisa é que a barra de progresso não mostra a porcentagem esperada que continua da esquerda para a direita. Alguma idéia do porquê? Eu usei pv com esses parâmetros -petra, que geralmente mostra a barra de progresso em que a barra ficava preenchida até terminar. Também votei na sua resposta.
214 Tak
@ Tak, pvnão tem como saber quantos dados existem para transferir. Se você tem uma estimativa desse montante, você pode passá-lo para ele com a -sopção (GNU du -sb srciria dar-lhe uma boa aproximação se os arquivos são grandes o suficiente)
Stéphane Chazelas
2

Alcatrão.

tar -cf - /var/log/ | pv | tar -C . -x

Exemplo:

# tar -cf - /var/log/ | pv | tar -C . -x
tar: Removing leading `/' from member names
58MB 0:00:05 [ 2.2MB/s] [                   <=> 
Pavor Anômalo
fonte
1

Aqui estão alguns comandos para copiar diretórios com informações de progresso.


Se houver muitos arquivos pequenos:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

Isso relatará o progresso com base no número de arquivos que são copiados.

Você pode redirecionar para /dev/nullse não precisar logfile.

Use o seguinte comando para obter filecount:

find sourcedir | wc -l

Se houver alguns arquivos enormes:

tar c sourcedir | pv -s size | tar x -C targetdir

Isso relatará o progresso com base nos bytes que são copiados.

targetdir deve existir.

Use o seguinte comando para obter size:

du -sh sourcedir

Se você deseja usar o rsync:

rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile

Obtenha filecountcomo mostrado acima.

Se você estiver copiando no mesmo sistema, rsync -aé praticamente o mesmo que cp -a. As vantagens do rsync são quando você está copiando pela rede ou se está atualizando (ou comparando) uma cópia anterior.

Veja aqui para mais detalhes:

lesmana
fonte
0

Você pode fazer um du -b /directory/na origem e no destino enquanto um comando de cópia normal estiver em andamento e comparar os dois. Isso é igualmente eficaz e não atrasa o processo de cópia, empurrando-o através de um cano.

Apóstolo
fonte
-1
find source-dir -print0 | xargs -0 -I % pv % > dest-dir/%
Christopher Hilla
fonte
3
Por favor, explique turnê solutipon, você vai querer OP para ser capaz de Checo-lo (e aprender)
vonbrand