Use paralelo para dividir muitos diretórios em subdiretórios

Use paralelo para dividir muitos diretórios em subdiretórios

Quero usar parallelpara dividir muitos diretórios em subdiretórios. Por exemplo, eu tenho 1.000.000 de diretórios com conteúdo, mas é demais para um diretório, então quero criar 10 diretórios no diretório principal e mover em cada um deles 100.000 diretórios originais.

Eu já tentei ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}"o comando, mas ele move apenas ~ 10.000 para um subdiretório (às vezes ~ 6.200, às vezes ~ 12.500) e cria muitos subdiretórios - às vezes 10 vezes mais do que preciso. Claro, não preciso exatamente de 100.000 dirs em cada subdiretório, pode ser 101.000 ou 98.500 dirs, deve ser um número na faixa de 100.000

Então, como posso fazer isso usando parallel?

Responder1

GNUparallelsolução:

parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *

  • j N- número de vagas de trabalho. Execute Ntrabalhos em paralelo. No seu caso, executaremos 10 jobs para distribuir (mover) todos os diretórios entre os novos 10 diretórios pais
  • -n100000- use no máximo 100000argumentos (dirnames) por linha de comando
  • {#}- número de sequência do trabalho a ser executado. Esta string de substituição será substituída pelo número de sequência do trabalho que está sendo executado
  • ::: arguments- use argumentsa linha de comando como fonte de entrada em vez de stdin (entrada padrão)

Para processar diretórios (nomes de diretórios) classificados por hora de modificação - use o seguinte pipeline:

ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'

informação relacionada