tar.gzから特定のファイルを抽出する方法


105

大きなtar.gzファイルから特定のファイルを抽出するにはどうすればよいですか?この質問でtarからファイルを抽出するプロセスを見つけましが、言及されたコマンドをそこで試したときにエラーが発生しました:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

その後、どのようにしてファイルを抽出しますtar.gzか?


ソリューションは、最初にアーカイブ全体を解凍する必要があることに注意してください。superuser.com/ questions / 655739 / …これを回避するには、zipなどの別の形式を使用する必要があります。ただし、ZIPは個々のファイルを個別に圧縮するため、圧縮率は低くなります。superuser.com / questions / 1013309/ …単一のファイルを抽出する速度と機能の両方をサポートする形式があるのではないかと思います。
Ciro Santilli新疆改造中心法轮功六四事件

回答:


119

使用することもできます tar -zxvf <tar filename> <file you want to extract>

ファイル名は、示されtar ztf test.tar.gzているとおりに正確に記述する必要があります。たとえば./extract11、またはの場合、それはsome/bunch/of/dirs/extract11あなたが与えなければならないものです(そしてファイルは正確にその名前で現れるでしょう、必要なディレクトリは自動的に作成されます)。

  • -x:tarにファイルを抽出するよう指示します。
  • -f:ファイル名/ tarball名を指定します。
  • -v:詳細(ファイルの抽出中に進行状況を表示)。
  • -z:gzipを使用してアーカイブをフィルタリングし、.gzファイルを解凍するために使用します。

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
アンキットバシスタ

1
次に、これをtar tf archive.tar.gz | grep extract11試してください。extract11がアーカイブにあるかどうかを確認してください-harish.venkat
1

8
ファイル名は、示されtar ztf test.tar.gzているとおりに正確に記述する必要があります。たとえば./extract11、またはの場合、それはsome/bunch/of/dirs/extract11あなたが与えなければならないものです(そしてファイルは正確にその名前で現れるでしょう、必要なディレクトリは自動的に作成されます)。
フォンブランド

ここにポイントを追加したいのですが、-zHP-UXなどの一部のバージョンのUNIX ではこのオプションは機能しません。
アンキットバシスタ

1
@ pj-brunet:いいえ、最後にいてはfいけません。ただし、ファイル名を直接指定する必要があります。この例は、tar名の後に他のすべてのオプションを指定すると正常に機能しますtar -f mytar.tar.gz -zxv dir/somefile。「mytar.tar.gz」から「dir / somefile」を抽出します。
mivk

34

呼び出されたtarball lotsofdata.tar.gzがあり、そこに1つのファイルがあることを知っているだけで、覚えているのはその名前にwordが含まれていることだけcontractです。次の2つのオプションがあります。

targrepを使用してtarballの内容をリストし、既知の部分に一致するファイルの完全なパスと名前を見つけてから、tarその1つのファイルを抽出して正確な詳細を把握できるようにするか、2つを使用しますファイル名についてほとんど知らないものに一致するすべてのファイルを抽出するだけの、ほとんど知られていないスイッチです。このオプションでは、フルネームやパスの一部を知る必要はありません。詳細は次のとおりです。

オプション1

$ tar -tzf lotsofdata.tar.gz | grep contract

これにより、名前に既知の部分が含まれるすべてのファイルの詳細がリストされます。次に、使用して必要なものを抽出します。

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

./パスが機能するためには、パスの前に必要な場合があります。

オプション2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

あなたがより簡単または最も便利だと思うあなた次第。


ドラット。最後のコマンドのタイプミス:-xzfを複製しました。これらのスイッチのインスタンスは1つだけにしてください。
ウェンディクリック14

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>与えwithour私のために働いた./完全なパスの開始時
user13107

あなたはこれらに我慢しなければならないかもしれません、しばらく時間がかかりました...また、それは明らかかもしれませんが、それらのディレクトリがまだ存在していなくても、現在のディレクトリに完全なディレクトリ構造を抽出します。
PJブルーネット

BSD tar(少なくともmacOSでは)はこの--wildcardsオプションをサポートしていません。でも同様の動作をすることができました-x -O *foo*fooファイルがfooで終わることを知っていたので、私の場合はファイル名globでした。
エリック胡

6

先日、数千のファイルがあるtarballから数百のファイルを抽出しようとしていました。必要なファイルを単一のワイルドカードで参照することはできません。だから私はグーグルでこのページを見つけました。

しかし、上記のトリックはどれも私の仕事には適していません。私は男を読んでしまい、このオプションを見つけた--files-fromので、私の最終的な解決策は

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

そしてそれは魅力のように機能します。

更新:リストファイルはから表示される形式と同じである必要がありtar -tvfます。そうでない場合、ファイルを抽出できません。


2

中かっこを省略した場合、あなたの例は私のために働く

$ tar --extract --file=test.tar.gz extract11

ファイルextract11がサブフォルダーにある場合、tarball内のパスを指定する必要があります。

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
アンキットバシスタ

そうすると、Extract11はtarファイルに存在しません。相対パスを指定する必要があることを確認してください。編集を参照
ベルンハルト

1

tar.gzファイルから特定のファイルを抽出する例を以下に示します。

ローカルファイルから:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

リモートURLから:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.