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

在 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 回答
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 回答