6

UNIX で、何百万ものファイルを含む可能性のある非常に大きなディレクトリを、カスタム定義された最大ファイル数 (ディレクトリごとに 100 など) の小さなディレクトリに分割するにはどうすればよいですか?

wgetこれらのサブディレクトリにファイルを自動的にダウンロードする方法を知っていれば、ボーナス ポイントです。.htmlの最上位パスに100 万ページある場合www.example.com

/1.html
/2.html
...
/1000000.html

ディレクトリごとに100個のファイルのみが必要な場合、それらは次のようなフォルダーにダウンロードされます

./www.example.com/1-100/1.html
...
./www.example.com/999901-1000000/1000000.html

wgetファイルをダウンロードした後にフォルダで UNIX コマンドを実行できるようにする必要があるだけですが、ダウンロードwget中にこれを実行できるかどうか知りたいです!

4

3 に答える 3

4

別のオプション:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n100)

または使用parallel

ls|parallel -n100 mkdir {#}\;mv {} {#}

-n100一度に 100 個の引数を取り{#}、ジョブのシーケンス番号です。

于 2015-12-25T14:48:34.283 に答える
3

これをいくつかのループで実行すると、うまくいくはずです (少なくともファイル名の数値部分については)。これをワンライナーで行うのは楽観的すぎると思います。

#! /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_dirtouch $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 などのライブラリを使用すると、最適化がはるかに簡単になります。

于 2012-06-24T14:17:03.443 に答える