並列処理を使用して、多数のディレクトリをサブディレクトリに分割します。

並列処理を使用して、多数のディレクトリをサブディレクトリに分割します。

多数のディレクトリをサブディレクトリに分割するために使用したいですparallel。たとえば、コンテンツを含むディレクトリが 1,000,000 個ありますが、1 つのディレクトリには多すぎるため、メイン ディレクトリに 10 個のディレクトリを作成し、それぞれに 100,000 個の元のディレクトリを移動します。

すでにls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}"コマンドを試しましたが、1 つのサブディレクトリに約 10,000 個しか移動されず (時には約 6,200 個、時には約 12,500 個)、サブディレクトリが多すぎます (必要な数の 10 倍になることもあります)。もちろん、各サブディレクトリに 100,000 個のディレクトリが必要なわけではなく、101,000 個または 98,500 個のディレクトリでもかまいません。100,000 の範囲の数値である必要があります。

では、 を使ってこれをどのように実行できるでしょうかparallel?

答え1

GNUparallel解決:

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

  • j N- ジョブスロットの数。最大でジョブを並列実行しますN。この場合は、10 個のジョブを実行して、すべてのディレクトリを新しい 10 個の親ディレクトリ間で分散 (移動) します。
  • -n100000100000-コマンドラインごとに最大引数(ディレクトリ名)を使用する
  • {#}- 実行するジョブのシーケンス番号。この置換文字列は、実行されるジョブのシーケンス番号に置き換えられます。
  • ::: arguments- argumentsstdin (標準入力) の代わりにコマンドラインから入力ソースとして使用します

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

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

関連情報