Movendo uma grande quantidade de arquivos (~ 100 000)

13

Eu trabalho com pastas que contêm muitos arquivos, como 100.000 ou até 1.000.000 de arquivos por pasta. Quando tento mover o conteúdo de uma pasta para outra, meu computador sempre fica preso. Mesmo quando o processo parece concluído, não consigo ver o conteúdo de nenhuma pasta porque o nautilus parece completamente congelado e tenho que forçar meu computador a reiniciar. Notei que isso acontece também quando tento mover 10.000 arquivos.

Isso é um problema do meu computador ou é normal ao trabalhar com esses números?

Alguma maneira inteligente de realizar essa transferência de arquivos?

Hyperion
fonte
3
Que tal usar o terminal ( cp -R SRC/ DEST/)
UniversallyUniqueID
2
@BharadwajRaju: Dependendo dos arquivos, o cp -a poderia ser melhor porque preserva os proprietários, os carimbos de data e hora e as permissões. Também recomendo o rsync, pois ele pode verificar transferências e copiar apenas arquivos que ainda não existem.
Michael
Atualização: gvfs-copy(do gvfs-binpacote) pode ser mais rápida que cp.
UniversallyUniqueID
Você tem duas perguntas aqui em vez de uma. Consulte a página Como perguntar para obter instruções.
Luís de Sousa

Respostas:

19

Talvez considere usar um método puro de linha de comando para transferir arquivos de quantidades muito grandes, sem dúvida você descobrirá que o processo é substancialmente mais rápido do que usar uma GUI.

Existem muitas maneiras diferentes de fazer isso, mas o seguinte funcionou com rapidez, segurança e eficiência no meu sistema:

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Alguma explicação para este comando:

  1. Seu diretório de entrada é o '.' caractere e para este comando em particular, você precisa estar nesse diretório
  2. Seu diretório de saída é o <destination>do meu exemplo. Obviamente, modifique isso para atender às suas próprias necessidades e deixar de fora os colchetes.
  3. Essa sintaxe permite nomes de arquivos com espaços como bônus :)

Permutações infinitas são possíveis, mas isso deve funcionar bem e com muito mais eficiência do que a GUI. Uma permutação, por exemplo: se você quiser mover apenas arquivos pdf, poderá executar:

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

O uso de xargsabre muitas possibilidades, particularmente com a movimentação de um número tão grande de arquivos. Muitas, muitas possibilidades ....

Problemas potenciais:

Há pelo menos duas armadilhas em potencial a serem ponderadas, graças aos comentários abaixo por esses pensamentos:

  1. O diretório de destino pode estar corrompido, em um local subseqüentemente inacessível, com erros de digitação etc. mvainda moverá os arquivos para lá! Tenha cuidado aqui ...
  2. Se a -topção ( --target-directory) estiver ausente e a pasta de destino for realmente um arquivo, você moverá um arquivo e falhará no restante. mvtem 2 usos: renomear fonte para destino ou mover fonte para diretório . Mais uma vez, tenha cuidado ...
andrew.46
fonte
2
Não faria apenas find . -maxdepth 1 -type f -exec mv -t test {} +?
Muni
@ muru: Obrigado por isso, cortei em -name...pedaços estranhos, mas deixei xargsno lugar.
precisa saber é o seguinte
2
Eu não sei ... Embora o comando esteja obviamente correto como está, consideraria uma movimentação completa um pouco propensa a erros. (E se você, por exemplo, esquecer de incluir o -tsinalizador? Acho que todos os arquivos seriam "movidos" para um único arquivo chamado test, resultando na perda de todos os seus arquivos, exceto um.) Acho que prefiro um rsyncseguido por, Se tudo deu certo, a rm. No entanto, posso imaginar cenários em que essa verificação não possa ser automatizada.
21716 Jos
@ Jos: Obrigado, eu adicionei uma nota de rodapé descrevendo essa possibilidade. É bom ver um rsync exemplo escrito como resposta?
precisa saber é o seguinte
O Linux suporta listas de argumentos extremamente longas, de modo que você provavelmente pode fazê-lo mv dir1/* dir2, e apenas recorrer find -execse houver algum problema ou se precisar evitar a correspondência de pastas com o seu glob. (Embora dependendo de suas convenções de nomenclatura, muitas vezes *.*irá corresponder a maioria dos arquivos, mas não a maioria dos diretórios, já que é comum ter um .extensionem arquivos, e comum a não ter um .em nomes de diretório)
Peter Cordes
4

Eu tive uma experiência semelhante antes, é normal quando se lida com um grande número de arquivos. Eu estava tendo uma grande coleção de folhas de dados em PDF (peças eletrônicas).

As ferramentas da GUI verificam alguns detalhes do arquivo e metadados (ícone / miniatura, tamanho, ...); nesse caso, será um grande negócio. Mesmo no Icon View e sem miniaturas, eles congelam, pois a maioria deles não foi projetada para esse caso extremo. A ferramenta GUI tenta carregar ícones de apresentação para todos os arquivos / pastas no diretório, mesmo esses itens não são visíveis para o usuário na parte da tela atual. A classificação também faz parte do problema e não há como evitá-lo.

  • Acabo dividindo arquivos em pastas separadas com base na marca / modelo com menos de 10000 cada. Pode ser que você use data (como a maioria das pessoas faz com fotos / digitalizações) ou primeira (s) letra (s) (como no repositório de pacotes do Ubuntu )
  • É mais fácil usar as ferramentas da CLI, pois elas mostram apenas o que você solicitou. Você pode usar locatepara pesquisa rápida em vez de find.
  • Para operação de movimentação, use mvno terminal (as ferramentas da GUI são lentas porque tentam atualizar a exibição periodicamente).

    Se estiver na mesma partição, o comando alterará apenas os ponteiros no índice do sistema de arquivos. Caso contrário, será uma operação dupla (copiar e excluir). Isso vai ser caro.

Há apenas um caso em que posso ajudar: se você estiver copiando esses arquivos várias vezes e eles não forem atualizados. Como fiz quando compartilho minha coleção com os amigos, cada vez que tento copiar, leva uma década. (Isso é mais útil apenas com arquivos de tamanho pequeno)

  • Crie um único pacote ou alguns pacotes, como zip sem / baixa compactação. Quando você o copia, fica mais rápido, então deixe o DMA fazer seu trabalho.
user.dz
fonte
3

Se você estiver procurando por uma solução que ofereça os benefícios das operações da linha de comando com o sentimento e a flexibilidade da GUI combinados, recomendo mc( comandante da meia-noite ).

vista em 2 painéis do mc commander

É um gerenciador de arquivos visual baseado em ncurses - você tem uma exibição em dois painéis nos seus arquivos e um menu disponível. É possível o uso do mouse, mesmo sobre ssh. Você pode navegar pelo seu fs, inspecionar arquivos com o visualizador de arquivos, filtrar de acordo com os critérios imediatamente e executar as operações de copiar ou mover na linha de comando.

É um clone do programa Norton commander do DOS, popular em meados dos anos oitenta. Funciona bem sempre que a GUI começa a se tornar não confiável para mim e ideal para o seu propósito.

emk2203
fonte
0

Encontrei problemas semelhantes - estava testando minha configuração de RAID e, ao fazer grandes transferências (por exemplo, mais de 100.000 arquivos e 1-2 TB de dados de uma só vez), parece que as transferências começam com bastante rapidez - digamos ~ 200MB / s, rapidamente diminua para um nível razoável de ~ 90-120 MB / s (possivelmente após consumir algum armazenamento em cache flash nas unidades). Depois de 20 a 30 minutos, a operação começa gradualmente a cair para um platô muito mais baixo ~ 30 a 40 MB / s, pior ao lidar com arquivos pequenos - levando uma operação de 4-5 horas para mais perto de 15 horas.

Passei algum tempo tentando diagnosticar - por exemplo, possíveis falhas na unidade. Apesar de tentar ferramentas diferentes - linha de comando, nautilus, não consegui manter uma taxa de transferência decente para operações de cópia muito grandes.

O que funcionou melhor para mim foi usar o comandante da meia-noite e, sempre que a cópia ficava lenta, pausava a operação até que a luz do disco rígido se apagasse depois que todas as operações pendentes eram apagadas - normalmente um minuto mais ou menos - e desinteressava o MC novamente e voltaria a um ritmo decente por mais 20 a 30 minutos. Bastante irritante embora.

M Szil
fonte