85

次の構造の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);
4

5 に答える 5

150

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
于 2013-01-12T17:38:46.997 に答える
32

これは、tarだけで、-transformフラグを使用してほぼ可能です。ただし、私が知る限り、残っているディレクトリを削除する方法はありません。

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

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

出力は次のようになります

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

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

于 2013-01-12T17:30:05.843 に答える
19

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
于 2014-02-27T10:46:59.427 に答える
2

@fordの答えに基づいています。これにより、my_dirnameフォルダーに抽出されます。現在存在するファイルに影響を与えることなく、空のフォルダを適切にクリアできるようにします。

tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete
于 2016-09-03T19:13:58.483 に答える
2

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] / ::'

于 2017-05-29T21:06:36.343 に答える