Quero usar parallel
para 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
GNUparallel
solução:
parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *
j N
- número de vagas de trabalho. ExecuteN
trabalhos 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áximo100000
argumentos (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
- usearguments
a 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_{#}'