アーカイブ名をフォルダ名として使用して、マルチスレッド方式で複数の7zアーカイブを独自のフォルダに抽出する方法は?

アーカイブ名をフォルダ名として使用して、マルチスレッド方式で複数の7zアーカイブを独自のフォルダに抽出する方法は?

アーカイブ名をフォルダー名として使用してすべての7zアーカイブを独自のフォルダーに抽出するには、次のコマンドを実行します。

7z x "*.7z" -o*

a.7zたとえば、2つのファイルとがある場合とb.7zフォルダがa作成されます。これにはそれぞれとその内容が含まれます(ディレクトリ構造を保持)。ba.7zb.7z

時には7zアーカイブが多すぎるため、複数のコアを使用してそれらを抽出したい場合があります。私はこれを読んだ回答渡すアルトゥーンS.タシュキノフ:

7z 解凍はシングルスレッドなので、圧縮形式の制限です。

parallelだから私の場合は7zアーカイブが複数あるのでそれを使うつもりです。

私は試した:

parallel -j4 '7z x {} -o{}' ::: *.7z

a.7zただし、2つのファイルとのある例に戻ると、b.7zコマンドはa.7z2つのファイルsumをandの代わりにsumb.7zフォルダに抽出しようとしますa.7z。これにより、sumがすでにインポートされていてファイルであるため、実行が中断されます。この問題をどのように解決できますか? 2つのフォルダと。b.7zaba.7zb.7zab

それが重要な場合は、Ubuntuを使用してください。

答え1

parallel{.}代わりに、以下を指定すると拡張機能が削除されます{}

parallel -j4 '7z x {} -o{.}' ::: *.7z

答え2

*inオプションに関する注意事項です-o{dir_path}。文書には次の内容が記載されています。

{dir_path}
これはターゲットディレクトリのパスです。 [...] 7-Zip*で指定すると、この文字はアーカイブ名に置き換えられます。{dir_path}*

初期コマンドの正しい構文は次のとおりです。

7z x \*.7z -o\*

つまり、2番目の項目*もエスケープする必要があります。それ以外の場合、シェルはそれを拡張しようとします。bashこれらのオプションを使用せずに使用することもできますnullglob。これがうまくいく理由です(一致するものが見つからず、文字通り渡します7z)...


gnu parallelこれでコマンドを実行するには、次のように使用できます*(上記のようにエスケープ処理)。

parallel -j4 '7z x {} -o\*' ::: *.7z

または、Stephenの答えなどの代替文字列を削除して*使用してくださいparallel{.}

関連情報