大きなtar.gzアーカイブから単一のフォルダーを抽出するにはどうすればよいですか?


132

5GBのアーカイブでこのコマンドを使用しています

tar -zxvf archive.tar.gz /folder/in/archive

これはこれを行う正しい方法ですか?コマンドライン出力なしで永遠に取っているようです...


絶対パスまたは相対パスを使用しましたか?それが正しいように見えること以外は、相対的でなければなりません。どのくらいの期間実行させましたか?また、システムはどれくらい優れていますか?それはかかります少なくとも速いマシンで数分。潜在的に1時間以上ですか?現在、テストを実行しています。
ケビン

はい、1時間後に完了しましたが、絶対パスが間違っていたので、正解でした。
ギャレットホール

5
Linuxでは、アーカイブtarがどこまで進んでいるかを見ることができますcat /proc/$(pidof tar)/fdinfo/0(複数のtarプロセスを実行している場合は、コマンドを調整します)。
ジル

また、重要な部分は末尾のスラッシュがないことです。を使用してfolder/folder2/も機能しません。
Marki555

回答:


145

tarデフォルトで相対パスを保存します。絶対パスを保存しようとすると、GNU tarはそう言っています:

tar -cf foo.tar /home/foo
tar: Removing leading `/' from member names

特定のフォルダーを抽出する必要がある場合は、tarファイルの内容を確認してください。

tar -tvf foo.tar

そして、正確なファイル名に注意してください。私のfoo.tarファイルの場合、次のように/home/foo/bar言って抽出できます。

tar -xvf foo.tar home/foo/bar # Note: no leading slash

そのため、投稿した方法は(必ずしも)正しい方法ではありません。先頭のスラッシュを省く必要があります。絶対パスをシミュレートcd /する場合は、まずスーパーユーザーであることを確認してください。また、これは同じことをします:

tar -C / -xvf foo.tar home/foo/bar # -C is the ‘change directory’ option

tarパスを相対パスに変換する理由は非常に明白で、正当な理由があります。1つは、アーカイブを元のソース以外の場所に復元する機能です。もう1つはセキュリティです。アーカイブを展開し、そのファイルが現在の作業ディレクトリに表示されることを期待し、代わりにシステムファイル(または自分の作業)を誤って上書きする可能性があります。

注:この-Pオプションを使用すると、絶対パスtar アーカイブされます。そのため、抽出する前に大きなアーカイブの内容をチェックすることは常に役に立ちます。


36
--strip-components=Nここでいくつかに役立つかもしれません。
アキュメナス

2
私の場合、書くことが必要だった./foldername/の代わりに、foldername私はタールを作成したときに私はそれを作成したので、それがあったことを推測する、tar -cvf santi.tar ./*と私は、これはそれが言ったことであるタール「記載されている」ときdrwxr-xr-x santi/santi 0 2016-04-11 09:42 ./foldername/
サンティアゴarizti

1
そして約.gz
ピータークラウス

1
@PeterKrauss -xvf-xzvf-zオプションを追加する)に変更され、明らかfoo.tarfoo.tar.gzアーカイブの名前が変更されます。-j(bz2)と最近のバージョン-J(xz)でも同じことが言えます。それ以外の場合、次のようなパイプラインzcat foo.tar.gz | tar -xvf - …も機能します。
Alexios

また、抽出中にすべての詳細な出力にうんざりしている場合はv、すべての例でスキップしてください。例えば、tar -tf foo.tarそしてtar -xf foo.tar ...
Bo R
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.