私はこのようなものを実行しています:
find . -maxdepth 1 -type f -note -iname "*.gpg" | sort | while read file ; do
echo "Encrypting $file..."
gpg --trust-model always --recipient "[email protected]" --output "$file.gpg" \
--encrypt "$file" && rm "$file"
done
これはうまく機能しますが、GPGは暗号化操作に複数のコアを使用するように最適化されていないようです。私が暗号化しているファイルのサイズは約2GBで、かなりの数があります。 Xジョブを並行して実行してファイルを暗号化してから削除できるようにしたいと思います。たとえば、一度に8ジョブに制限を設定して、これを行うにはどうすればよいですか?
GNU Parallel ツールをインストールすると、達成しようとしていることを非常に簡単に行うことができます。
$ find . -maxdepth 1 -type f -note -iname "*.gpg" | sort | \
parallel --gnu -j 8 --workdir $PWD ' \
echo "Encrypting {}..."; \
gpg --trust-model always \
--recipient "[email protected]" --output "{}.gpg" \
--encrypt "{}" && rm "{}" \
'
上記は、find
の出力を取得してparallel
まで実行し、一度に8つ実行しています。どこでも{}
が発生すると、find
から渡されるファイル名がそれらの場所の{}
に置き換わります。
gnu parallel とその--semaphore
オプションを確認することをお勧めします。ドキュメントから:
- セマフォ
カウントセマフォとして機能します。 -セマフォにより、GNU parallelはバックグラウンドでコマンドを開始します。同時ジョブの数に達すると、GNU parallelは、これらのいずれかが別のコマンドを開始する前に完了してください。
--jobs 8
を使用して、ジョブの数を8に制限します。parallel
の場合と同じように、sortの出力をxargs
にパイプできます。 sem
はparallel --semaphore
のエイリアスです
同時に実行されるコマンドの最大数を制御できる使いやすいPerlスクリプトを作成しました: https://github.com/matmu/parallelize_cmds
あなたにとって興味深いかもしれません。