並列性を使用して多くのディレクトリをサブディレクトリに分割する

並列性を使用して多くのディレクトリをサブディレクトリに分割する

parallel多くのディレクトリをサブディレクトリに分割するために使用したいと思います。たとえば、コンテンツが含まれているディレクトリが1,000,000個あるが、1つのディレクトリに入れるには多すぎるため、デフォルトディレクトリに10個のディレクトリを作成し、各ディレクトリから100,000個の元のディレクトリを移動しようとします。

コマンドを試しましたが、ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}"〜10 000万サブディレクトリ(時には〜6200、時には〜12 500)に移動し、あまりにも多くのサブディレクトリを作成します。時には必要なものより10倍も多いです。もちろん、各サブディレクトリに正確に100,000のディレクトリが必要ではありません。 101,000または98,500のディレクトリにすることができ、100,000の範囲の数字でなければなりません。

それでは、これを行うにはどうすればよいですかparallel

答え1

牛に似た一種の栄養parallel解決策:

parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *

  • j N- ポジション数。Nジョブを並列に実行します。あなたの場合は、10のタスクを実行して、新しい10の親ディレクトリの間にすべてのディレクトリを展開(移動)します。
  • -n100000100000-コマンドラインごとに使用される最大パラメータ(ディレクトリ名)
  • {#}- 実行するジョブのシーケンス番号です。この代替文字列は、実行中のジョブのシリアル番号で置き換えられます。
  • ::: argumentsarguments- stdin(標準入力)の代わりにコマンドラインを入力ソースとして使用する

変更時間ごとにソートされたディレクトリ(ディレクトリ名)を処理するには、次のパイプラインを使用します。

ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'

関連情報