web-dev-qa-db-ja.com

tarを使用してフォルダー構造なしでファイルを抽出する方法

次の構造を持つtar.gzファイルがあります。

folder1/img.gif
folder2/img2.gif
folder3/img3.gif

フォルダ階層なしで画像ファイルを抽出したいので、抽出結果は次のようになります。

/img.gif
/img2.gif
/img3.gif

UnixとPHPの組み合わせでこれを行う必要があります。ここに私がこれまで持っているものがあり、指定されたディレクトリにそれらを抽出するように機能しますが、フォルダ階層は保持します:

exec('gtar --keep-newer-files -xzf images.tgz -C /home/user/public_html/images/',$ret);
47
Ben Jackson

Tarの-strip-componentsオプションを使用できます。

 --strip-components count
         (x mode only) Remove the specified number of leading path ele-
         ments.  Pathnames with fewer elements will be silently skipped.
         Note that the pathname is edited after checking inclusion/exclu-
         sion patterns but before security checks.

あなたと似た構造のtarファイルを作成します。

$tar -tf tarfolder.tar
tarfolder/
tarfolder/file.a
tarfolder/file.b

$ls -la file.*
ls: file.*: No such file or directory

次に、以下を実行して抽出します。

$tar -xf tarfolder.tar --strip-components 1
$ls -la file.*
-rw-r--r--  1 ericgorr  wheel  0 Jan 12 12:33 file.a
-rw-r--r--  1 ericgorr  wheel  0 Jan 12 12:33 file.b
87
ericg

これはalmost tarのみで--transformフラグを使用して可能ですが、残っているディレクトリを削除する方法はありません。

これにより、アーカイブ全体がフラット化されます。

tar xzf images.tgz --transform='s/.*\///'

出力は

folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif

残念ながら、別のコマンドでディレクトリを削除する必要があります。

18
ford

Tarバージョンを確認します。

$ tar --version

バージョンがtar-1.14.90よりも> =の場合は、--strip-components

tar xvzf web.dirs.tar.gz -C /srv/www --strip-components 2

それ以外の場合は--strip-path

tar xvzf web.dirs.tar.gz -C /srv/www --strip-path 2
8
Minimul

に基づく @fordの答え。これにより、my_dirnameフォルダーに抽出されます。そのため、現在存在するファイルに影響を与えることなく、空のフォルダーを適切に消去できます。

tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete
1
Weston Ganger

Mytar.tar.gzのサブフォルダーでimg * .gifを見つけ、。/に抽出します。

tar -zxf mytar.tar.gz --absolute-names --no-anchored img * .gif --transform = 's:。*/::'

Mytar.tar.gzのこの特定の質問にリストされている3つのフォルダーのいずれかでimg * .gifを見つけ、。/に抽出します。

tar -zxf mytar.tar.gz --absolute-names --no-anchored img * .gif --transform = 's:^ folder [1-3]/::'

1
Pancho