単一のtar呼び出しを使用した複数の.tar.gzファイルの抽出

単一のtar呼び出しを使用した複数の.tar.gzファイルの抽出

tar一度に複数のファイルを抽出するように言うことができるかどうか疑問に思います。

私は長年の経験を持つUnixユーザーです。もちろん、抽出したいアーカイブごとに、forまたはfind同様のものを一度呼び出すことができますが、結果が有効なコマンドラインを思い出すことはできません。tar私のtar1回の抽出には2つの.tar.gzファイルがあります。 (いいえ、問題ありませんfor。ただそれなしでできるかどうかを尋ねるだけです。)

気になってこんな質問をしたかもしれませんが、

  • tarこれをサポートする奇妙なポイントがあります
  • 私が試したときに提案された-Mパラメータを使用する方法を知っている人はいますか?tartar -zxv -f a.tgz -f b.tgz
  • 私たちは両方とも視覚障害者であり、これは完全に簡単です。ただし、オンラインで使用していないか、類似のヒントが見つかりforませfindxargs

返信しないでくださいtar -zxvf *.tar.gz(これを行うといいえうまくいきます)そして完全に自信がある場合にのみ「動作しません」と答えてください(おそらく良い説明があります)。なぜ、また)。

編集する:私は指摘されましたスタックオーバーフローに関するこの質問への回答現在の構文に違反しないと、これは不可能であることが非常に詳細に指定されていますが、tar私はこれが本当だとは思わない。 IMHO、既存の構文を使用または中断しませんtar -zxv -f a.tgz -f b.tgztar -zxv --all-args-are-archives *.tar.gz

答え1

これは可能です。構文はとても簡単です。

$ cat *.tar | tar -xvf - -i

-iオプションは、マニュアルページのtarアーカイブの末尾にあるEOFを無視します。

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)

答え2

のための*.tar.gz:

for file in *.tar.gz; do tar -zxf "$file"; done

のための*.tar.bz2:

for file in *.tar.bz2; do tar -jxf "$file"; done

のための*.tar.xz:

for file in *.tar.xz; do tar -Jxf "$file"; done

のための*.tar.zst 新しい:

for file in *.tar.zst; do tar --zstf -xf "$file"; done

答え3

ループを使用する必要があります。tar複数のオプションを許可するためにコマンドライン構文を壊すことはありませんが、さまざま-fなエッジ条件で複数のアーカイブを順番に処理するためのコードを追加する必要があります(間にあるアーカイブの形式が正しくない場合はどうなりますか? ?))圧縮メカニズム?-C複数のオプションもありますか(特定のディレクトリに抽出するためのGNU tarオプション)? -K(メンバー名で始まるGNU tarオプションの場合)はどうですか?

ループを回避する1つの方法forは、インストールして有効にすることです。AVFS、ㅏヒューズアーカイブへの透過的なアクセスを提供するファイルシステム。各アーカイブは/path/to/archiveディレクトリとしても使用されます~/.avfs/path/to/archive#。ワイルドカードを使用してアーカイブを一致させる場合は、#それをワイルドカード一致に追加するのに障害があります。これはzshで行うことができます。

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination

関連情報