count=target=0;
find srcdir/ -type f |
while read file; do
count=$((count+1));
target=$((count/10000));
[ -d $target ] || mkdir $target
echo mv "$file" $target; #remove the 'echo' if you like what you see
done
reduzida a uma única linha (e com a salvaguarda 'echo' removida):
count=target=0; find srcdir/ -type f | while read file; do count=$((count+1)); target=$((count/10000)); [ -d $target ] || mkdir $target; mv "$file" $target; done
Este não é o mais rápido, mas está limpo. esta solução evita analisar a saída do link 'ls' e cita as referências a "$ file", caso contrário arquivos com nomes anormais (como Maildir arquivos são frequentemente) iria quebrar o código. Por exemplo, se algum dos arquivos tiver espaços ou ponto-e-vírgulas, referenciar o arquivo $ sem aspas não o levará longe (na maior parte do tempo)
Leia mais sobre as citações: link e link