単一のtar呼び出しで複数の.tar.gzファイルを抽出します


35

私はtar、1回の実行で複数のファイルを抽出するように指示することが可能かどうか(そしてもちろん、どのように)考えていました。

私は数年経験のあるUnixユーザーであり、もちろん、使用したいforfindまたはそのようなものを使用tarして、抽出したいアーカイブごとに1回呼び出すことができることを知っていますが、私の原因となったコマンドラインを見つけることができませんでしたtar2つの.tar.gzファイルを一度に抽出します。(そして、いいえ、何も悪いことはありませんfor、私は単にそれなしで行うことが可能かどうかを尋ねています。)

好奇心からではなく、この質問をしています

  • tarこれをサポートする奇妙な分岐点があります
  • 誰かが私が試したときに私に提案した-Mパラメータを使用する方法を知っていますtartar -zxv -f a.tgz -f b.tgz
  • 我々はすべての盲目だし、それを行うのは全く簡単だ-しかし私は、任意の利用していないウェブでのヒントを見つけることができませんでしたforか、findまたはxargs様または。

返信しないでくださいtar -zxvf *.tar.gz(つまりはありませんので、ない仕事)とのみ、あなたがそれについて絶対に確信している場合は、「仕事をしません」と答える(そしておそらく良い説明持つ理由は、あまりにもを)。

編集:私はスタックオーバーフローに関するこの質問の答えを指摘されました。それは、現在のtar構文を破ることなしには不可能であると非常に詳しく述べていますが、それは真実ではないと思います。を使用するtar -zxv -f a.tgz -f b.tgztar -zxv --all-args-are-archives *.tar.gz、既存の構文を破壊しない、imho。


好奇心から、ループ構造を避ける方法について考え始めた状況は何ですか?
アンクルジャミル

1
参考までに、GNU tarは、パラメータを使用したマルチボリュームtarアーカイブをサポートしてい-Mます。
スティーブo

1
unclejamil:HowToを書いていますが、その手順の1つはいくつかの圧縮ファイル(.tar.bz2、.tar.gz、.zip)の解凍です。また、HowToなので、これを行うための最もエレガントなコマンドラインはどのようなものになるのだろうかと考えていました。:)
scy

回答:


39

これは可能であり、構文は非常に簡単です。

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

-iオプションは、manページのtarアーカイブの最後にあるEOFを無視します。

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

1
これは私にとってはうまくいくようでした。使用した正確なコマンド:cat *.tar.bz2 | tar -ixjv。ありがとう!
SCY

1
<tgzの場合> cat * .tgz | tar -xzvf--i -C / destination / <または> * .tgz内のファイル。tar -xzvf $ file -C / destination /; 完了
Ferroao

27

* .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

1
ここでフォーマットを修正すると、より読みやすくなります。
eyoung100

これは素晴らしい。それは、端末での表示方法がそれであるため、フォーマットも素晴らしいです
-smatthewenglish

1
$fileファイルに名前にスペースが含まれている場合は、引用符で囲むことを忘れないでください。
アレクサンドル・レボ

これは、tarの単一の呼び出しを使用して複数のアーカイブを抽出できるかどうかの質問には実際に答えません。さらに、ユーザーは、forループを使用して一連のファイルを反復処理する方法にすでに慣れていると言います。
クサラナナンダ

2

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

forループを回避する可能性の1つは、アーカイブへの透過的なアクセスを提供するFUSEファイルシステムであるAVFSをインストールしてアクティブ化することです。各アーカイブはディレクトリとしても機能します。アーカイブをワイルドカードと一致させたい場合、ワイルドカードの一致にそれを追加するというハードルがあります。zshで実行できます。/path/to/archive~/.avfs/path/to/archive##

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

-1

find . -name "*.tar.gz" -exec tar xzf {} \;


これは何をしますか?
Pierre.Vriens

1
これにより、検出されたファイルごとにtarを呼び出す暗黙的なループが導入され、ユーザーはすでにこれを行う方法を知っていると言います。
クサラナナンダ

申し訳ありませんが、質問を注意深く読んでいませんでした。複数のtarパックを抽出する方法を探していました。上記の答えを読んで、検索の使用がより簡単になると思います。
zjengjie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.