次の構造を持つ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);
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
これはalmost tarのみで--transformフラグを使用して可能ですが、残っているディレクトリを削除する方法はありません。
これにより、アーカイブ全体がフラット化されます。
tar xzf images.tgz --transform='s/.*\///'
出力は
folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif
残念ながら、別のコマンドでディレクトリを削除する必要があります。
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
に基づく @ford
の答え。これにより、my_dirnameフォルダーに抽出されます。そのため、現在存在するファイルに影響を与えることなく、空のフォルダーを適切に消去できます。
tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete
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]/::'