如何使用tar提取没有文件夹结构的文件

时间:2013-01-12 17:14:46

标签: php linux unix 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);

5 个答案:

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