海洋学者の友人は職場で数ヶ月間のデータをバックアップする必要があります。彼女はあまりにも大変だったので、資源した。バックアップするディレクトリが何百ものあり、ディレクトリと同じ名前のファイルにtar / bzipで圧縮しようとしています。これは順番に簡単に実行できますが、私のワークステーションにある何百ものコアを活用したいと思います。
質問:findと-n
-P
argsまたはGNU Parallelを使用して最終製品に名前を付けるときに、できるだけ多くのコアを使用するためにディレクトリをtar / bzipに圧縮するにはどうすればよいですか origonalDirName.tar.bz2
?
私はfindを使用して同時に100個のファイルを圧縮しており、非常に高速です。各ファイル名を各ディレクトリのファイル名にする方法はわかりませんが、これは問題の解決策です。
答え1
ただtar
パイプstdout
で接続するだけですpigz
。 (ディスクアクセスを並列化するのではなく、圧縮部分のみを並列化したい可能性が高いです。)
$ tar -c myDirectory/ | pigz > myDirectory.tar.gz
上記の単純な呼び出しは、tar
基本的に可逆的な方法でディレクトリツリーを結合します。この例のように、圧縮部分を分離することができます。
pigz
マルチスレッド圧縮を実行します。使用するスレッドの数は調整でき-p
、デフォルトは使用可能なコアの数です。詳細については、以下で確認できます。Pigz githubリポジトリ
答え2
pbzip2はうまく動作します。上記の答えと同様に、tarをstdoutに、パイプをpbzip2に接続します。
$ tar -cf - mydir/ | pbzip2 > mydir.tar.bz2
pbzip2には、プロセッサ数、使用されるメモリ量、圧縮レベルなどを調整するためのいくつかのオプションがあります。
または、ディレクトリごとに1つのアーカイブ(ディレクトリ名にスペースや特殊文字がないと仮定):
for dir in * ; do
[[ ! -d ${dir} ]] && continue
tar cf - ${dir} | bzip2 > ${dir}.tar.bz2 &
done
答え3
GNU Parallelを使用すると、次のようになります。
parallel tar jcvf /tmp/{= s:/$:: =}.tar.bz2 {} ::: */
または:
parallel tar jcvf /tmp/{}.tar.bz2 {} ::: *
より良い圧縮のために、以下を試してください。
parallel tar -I pxz -cvf /tmp/{= s:/$:: =}.tar.xz {} ::: */
s:/$::
Perl式です。結末をなくした/