これをいくつかのループで実行すると、うまくいくはずです (少なくともファイル名の数値部分については)。これをワンライナーで行うのは楽観的すぎると思います。
#! /bin/bash
for hundreds in {0..99}
do
min=$(($hundreds*100+1))
max=$(($hundreds*100+100))
current_dir="$min-$max"
mkdir $current_dir
for ones_tens in {1..100}
do
current_file="$(($hundreds*100+$ones_tens)).html"
#touch $current_file
mv $current_file $current_dir
done
done
最初にコメントアウトし、コメントを外してパフォーマンステストを行いmkdir $current_dir
ましmv $current_file $current_dir
たtouch $current_file
。これにより、10000 ファイル (目標の 1000000 ファイルの 100 分の 1) が作成されました。ファイルが作成されたら、次のスクリプトに戻りました。
$ time bash /tmp/test.bash 2>&1
real 0m27.700s
user 0m26.426s
sys 0m17.653s
ファイル システム間でファイルを移動しない限り、各mv
コマンドの実行時間は一定であるため、同等またはそれ以上のパフォーマンスが得られるはずです。これを 100 万ファイルにスケーリングすると、約 27700 秒、つまり 46 分になります。1 つのコマンドで特定のディレクトリのすべてのファイルを移動したり、内側の for ループを削除したりするなど、最適化にはいくつかの方法があります。
100 万個のファイルを取得するために「wget」を実行すると、これよりもはるかに時間がかかり、ほぼ確実に何らかの最適化が必要になります。http ヘッダーだけで帯域幅を維持すると、実行時間が数時間短縮されます。シェル スクリプトがおそらくその仕事に適したツールだとは思いません。cpan で WWW::Curl などのライブラリを使用すると、最適化がはるかに簡単になります。