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

Linux 如何使用tar提取没有文件夹结构的文件,linux,unix,tar,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/

我有一个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,使用--transform标志,这几乎是可能的,只是据我所知,没有办法删除剩余的目录

这将使整个存档变平:

tar xzf images.tgz --transform='s/.*\///'
输出将是

folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif
不幸的是,您需要用另一个命令删除目录。

您可以使用tar的--strip components选项

我创建了一个与您的结构类似的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

检查焦油版本,例如:

$ tar --version
如果版本小于tar-1.14.90,则使用
--剥离组件

tar xvzf web.dirs.tar.gz -C /srv/www --strip-components 2
否则使用
--条带路径

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

基于福特公司的回答。这个将把它解压缩到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--绝对名称--无锚定img*.gif --transform='s:.*/:'

在mytar.tar.gz中此特定问题中列出的3个文件夹中的任意一个文件夹中查找img*.gif并提取到。/

tar-zxf mytar.tar.gz--绝对名称--无锚定img*.gif --transform='s:^文件夹[1-3]/:'


我假设您想要的不是手动迭代每个目录,将文件移动到您的路径,然后删除空文件夹?我不知道有一个
--flatte
选项隐藏在任何地方,但我可能弄错了。条带组件是否有可以使用的最大数量?如果.tar只包含一个文件夹的层次结构,而strip组件是2,会发生什么?此外,strip components是否会更改这些图像文件的名称或只是删除文件夹?我建议您使用它,并根据您的具体情况确定它是否适用于您。我尝试使用比包含的目录结构更高的数字,它也删除了这些文件。所以你必须知道要剥离的目录的确切数量。这太棒了!但有一件事,如果我们不知道要剥离多少组件,该怎么办?我们只想得到文件,根本不想得到文件夹?在RHEL 6.2上,这个答案不起作用,但这个答案起作用(即使在创建归档文件时也是如此)。:)耶!我已经找了一段时间了。干得好!如果我根本不想要任何文件夹,只想提取文件呢?这太棒了。到目前为止(版本1.29),它甚至没有在提取期间创建目录。tar 1.23也没有创建目录。
tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete