両方のフォルダから.lzoファイルを並列に抽出し、元の.lzoファイルを削除します。

両方のフォルダから.lzoファイルを並列に抽出し、元の.lzoファイルを削除します。

だから私のフォルダに解凍し、すべてのファイルを削除する必要がある.lzoファイルがあります。フォルダでも同じことをする必要があります。両方のフォルダに約150個のファイルがあり、合計約300個のファイルがあります。/test01/primary.lzo/test02/secondary.lzo.lzo

コマンドラインで、次のように圧縮されていないファイルを実行しましたlzop -d file_name.lzo

.lzoすべてのファイルを解凍し、.lzo同時に両方のフォルダ内のすべてのファイルを削除する最速の方法は何ですか?以下は私のコードです。

#!/bin/bash

set -e

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary

parallel lzop -dU -- ::: {"$PRIMARY","$SECONDARY"}/*.lzo

.lzoメインフォルダと補助フォルダのファイルを同時に圧縮解除と削除をしたいと思います。上記のコードを使用すると、まずPRIMARYフォルダで実行され、次にSECONDARYフォルダで実行されます。 PRIMARYとSECONDARYの両方で並列性を達成するには?

そして、すべてのファイルを解凍して後で削除するのですか、それとも1つのファイルを解凍してそのファイルを削除して次のファイルに進むのですか?

私はこれを試しましたが、うまくいきません。最初の40個のファイルに対してのみ機能し、それ以降はまったく機能しません。

#!/bin/bash

set -e

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary

parallel -j 40 lzop -dU -- ::: "$PRIMARY"/*.lzo &
parallel -j 40 lzop -dU -- ::: "$SECONDARY"/*.lzo &
wait

ベストアンサー1

私が正しく理解したら、両方のディレクトリを並列化しながら(おそらく)2つのストレージデバイス間の負荷分散をしたいですか?

最も簡単な解決策は、おそらく入力のファイル名を並列にインターリーブすることです。

paste -d'\n' <(ls "$PRIMARY"/*.lzo) <(ls "$SECONDARY"/*.lzo) | parallel lzop -dU --
  • このpasteコマンドは、各ファイルから1行を取り、通常は出力ファイルに並べて配置しますが、ここでは\n区切り文字として使用してズレッドラインで終わります。

  • <(...)bash構文は、あるコマンドの出力をまるでファイルのように別のコマンドに「パイプ」するので(一時名前付きパイプを使用するようです)、一度に2つの入力をパイプできます。

  • 指定しない場合、パラレルはstdinからファイル名を読み取り、:::指定しない場合はCPUごとに1つのジョブを実行します-j。リニアな方法で入力リストに沿って作業するため、インターリーブは必要な方法で負荷を分散させる必要があります。

おすすめ記事