如何使用 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);
95096 次浏览

This is almost possible with tar alone, using the --transform flag, except that there's no way to delete the left over directories as far as I can tell.

This will flatten the entire archive:

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

The output will be

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

You will then need to delete the directories with another command, unfortunately.

You can use the --strip-components option of tar.

 --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.

I create a tar file with a similar structure to yours:

$tar -tf tarfolder.tar
tarfolder/
tarfolder/file.a
tarfolder/file.b


$ls -la file.*
ls: file.*: No such file or directory

Then extracted by doing:

$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

Check the tar version e.g.

$ tar --version

If version is >= than tar-1.14.90 use --strip-components

tar xvzf web.dirs.tar.gz -C /srv/www --strip-components 2

else use --strip-path

tar xvzf web.dirs.tar.gz -C /srv/www --strip-path 2

Based on @ford's answer. This one will extract it to the my_dirname folder. So that we can properly clear the empty folders without affected currently existing files.

tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete

Find img*.gif in any sub folder of mytar.tar.gz and extract to ./

tar -zxf mytar.tar.gz --absolute-names --no-anchored img*.gif --transform='s:.*/::'

Find img*.gif in any of the 3 folders listed in this specific question in mytar.tar.gz and extract to ./

tar -zxf mytar.tar.gz --absolute-names --no-anchored img*.gif --transform='s:^folder[1-3]/::'