我有一个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);
答案 0 :(得分:84)
您可以使用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
答案 1 :(得分:18)
使用--transform标志,仅使用tar就可以几乎,但据我所知,没有办法删除左侧目录。
这将使整个档案变得扁平化:
tar xzf images.tgz --transform='s/.*\///'
输出
folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif
不幸的是,您需要使用其他命令删除目录。
答案 2 :(得分:8)
检查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
答案 3 :(得分:1)
基于@ford
的回答。这个将它提取到my_dirname文件夹。这样我们就可以在不影响当前现有文件的情况下正确清除空文件夹。
tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete
答案 4 :(得分:1)
在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:^夹[1-3] / ::'