Baixando uma grande quantidade de arquivos do servidor unix

0

existem cerca de 7000000 arquivos em um único diretório, totalizando 650 GB.

(listá-los sozinho nem é possível)

que opções eu tenho para baixar essas opções?

Eu estava pensando em usar tar para fazer pacotes de 1 GB e baixá-los.

ou mova-os em partes para diretórios diferentes, para facilitar a sua listagem.

o sistema operacional é o servidor Ubuntu.

sempre que um arquivo foi adicionado, uma entrada foi feita em um banco de dados e a contagem agora é de > 7000000. Isso também significa, eu sei seus nomes de arquivos.

    
por clamp 16.01.2015 / 13:27

2 respostas

1

Este é um grande PITA:

  • todos os programas mencionados, tudo que usar qualquer variante de ls irá falhar ou expirar
  • você deve acompanhar o progresso por outros meios
  • você deve remover o estresse do sistema de arquivos
  • você deve evitar duplicar a situação em que você está. rsync duplicará a situação. raw tar duplicará a situação. você não quer ter 7000000 cópias em alguma outra pasta.

Ok, dado o que pode funcionar nesta situação:

  • escolha python ou o que você sabe melhor.
  • converse com o banco de dados e obtenha nomes de arquivos em blocos de 1000.
  • copie esses 1000 arquivos para outro diretório e zip / tar nesse diretório para enviá-lo para outro local. como e se você mover esses arquivos incluídos fora do caminho depende um pouco da quantidade de armazenamento que você tem nesse disco. manter outros 7000000 arquivos (não importa o quão organizados) no mesmo sistema de arquivos é o estresse.
  • se este bloco de 1000 funcionou ok e está tudo bem, escreva o id mais alto daquele pedaço para uma tabela de banco de dados diferente (você não quer ALTER TABLE naquele 7000000 para apenas adicionar uma nova coluna 'movida', pode demorar muito e você altera "a verdade"; crie uma segunda tabela e acompanhe o progresso)
  • repita.

coisa mais importante: copie, verifique e exclua os arquivos originais dessa pasta enorme.

também é imprudente copiar 1: 1 os arquivos para outro lugar, já que você teria repetido a situação ruim em que você se encontra agora.

boa sorte.

    
por 16.01.2015 / 14:59
1

Se você listar os nomes de arquivos em um arquivo chamado ~/filelist.txt , vá para o diretório onde estão todos os arquivos, o script a seguir deve movê-los para subdiretórios dimensionáveis, um para cada dia em que os arquivos foram criados : -

cat ~/filelist.txt |                                           \
while f='line';                                                \
do ( d="'ls -l --time-style=+%y-%m-%d "$f"|awk '{print $6}''"; \
     [ -d "$d" ] || mkdir "$d";                                \
     mv "$f" "$d"/                                             \
   )                                                           \
done

Isso levará muito tempo para ser executado, porque você executará dois ou três programas para cada arquivo, bem como um sub-shell bash .

Eu sugiro que você teste primeiro antes de começar usando head em vez de cat e prefixando echo com os comandos mkdir e mv . É claro que para este teste, mkdir será listado repetidamente para arquivos com a mesma data, pois os diretórios não estão realmente sendo criados. Se você repetir com head -n 1000 ou mais, você deve ter uma idéia de quantos arquivos irão para cada diretório.

Se houver muitos ou poucos, você pode alterar o formato do estilo de hora para torná-lo arquivos semanais ou por hora. Você deve apontar para cerca de 1000-10000 arquivos em cada diretório, o que lhe dará 700-7000 diretórios, ambos gerenciáveis.

Uma vez que eles são movidos para subdiretórios, você pode zipar cada diretório, o que deve lhe dar cerca de 7000 arquivos para mover, e uma pequena fração dos 650GB para copiar, se forem arquivos de texto.

    
por 16.01.2015 / 16:14