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

3

Eu quero usar parallel para dividir vários diretórios em subdiretórios. Por exemplo. Eu tenho 1 000 000 diretórios com conteúdo, mas é demais para um diretório, então eu quero criar 10 dirs no diretório principal e mover em cada um deles 100 000 dirs originais.

Já experimentei o comando ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}" , mas ele move apenas ~ 10.000 em um subdiretório (às vezes ~ 6200, às vezes ~ 12.500) e cria subdiretórios em excesso - às vezes em 10 vezes mais do que o necessário. Claro, eu 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 ?

    
por don-prog 22.11.2017 / 22:50

1 resposta

2

Solução

GNU parallel :

parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *
  • j N - número de jobslots. Execute até N jobs em paralelo. No seu caso, executaremos 10 jobs para distribuir (mover) todos os diretórios entre os novos 10 diretórios pai
  • -n100000 - use no máximo 100000 arguments (dirnames) por linha de comando
  • {#} - número de sequência do trabalho a ser executado. Esta sequência de substituição será substituída pelo número de sequência do job que está sendo executado
  • ::: arguments - use arguments da linha de comando como fonte de entrada em vez de stdin (entrada padrão)

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

ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'
    
por 22.11.2017 / 23:37