如何使用 Python 将文件添加到 tarfile,而不添加目录层次结构?
当我在具有文件路径的 tarfile
对象上调用 add()
时,该文件将添加到与目录层次结构关联的 tarball 中。换句话说,如果我解压缩 tar 文件,则会复制原始目录层次结构中的目录。
有没有一种方法可以简单地添加一个没有目录信息的普通文件,以便解压生成的 tarball 生成一个平面文件列表?
When I invoke add()
on a tarfile
object with a file path, the file is added to the tarball with directory hierarchy associated. In other words, if I unzip the tarfile the directories in the original directories hierarchy are reproduced.
Is there a way to simply add a plain file, without directory info, so that untarring the resulting tarball produces a flat list of files?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
使用 TarFile.add() 方法的 arcname 参数是匹配目标的另一种便捷方法。
示例:您想要将目录 repo/a.git/ 存档到 tar.gz 文件,但您希望存档中的树根以 开头a.git/ 但不是 repo/a.git/,您可以执行以下操作:
Using the arcname argument of TarFile.add() method is an alternate and convenient way to match your destination.
Example: you want to archive a dir repo/a.git/ to a tar.gz file, but you rather want the tree root in the archive begins by a.git/ but not repo/a.git/, you can do like followings:
您可以使用
tarfile.addfile()
,在TarInfo
对象中,这是对于第一个参数,您可以指定与要添加的文件不同的名称
。这段代码应将
/path/to/filename
添加到 TAR 文件,但会将其提取为myfilename
:You can use
tarfile.addfile()
, in theTarInfo
object, which is the first parameter, you can specify aname
that's different from the file you're adding.This piece of code should add
/path/to/filename
to the TAR file but will extract it asmyfilename
:也许您可以使用 TarFile.add(name, arcname) 的“arcname”参数。它采用文件在存档中将具有的备用名称。
Maybe you can use the "arcname" argument to TarFile.add(name, arcname). It takes an alternate name that the file will have inside the archive.
感谢@diabloneo,创建目录的选择性 tarball 的功能
thanks to @diabloneo, function to create selective tarball of a dir
以下是在不添加文件夹的情况下压缩
folder
中的文件列表的代码示例:Here is the code sample to tar list of files in
folder
without adding folder:我一直在寻找类似的问题,但被重定向到此页面,因此我可能会为其他谷歌用户添加此问题。
就我而言,我想要一个 tar 文件,其中仅包含相对文件名,这将递归地工作。因此,zip 中的可压缩目录
如下所示:
默认情况下,python
tarfile
将添加/
作为额外条目。我的目标是删除 tar 文件中的前导
/
条目,因为它被视为 ZipSlip 漏洞当使用带有此类漏洞的 tar 时,您会收到一条警告
我不确定为什么 python
tarfile
库没有简单的方法来处理这个问题,但我想到了这段代码完全符合我的要求:I was looking for similar question but got redirected to this page so I might add this for further fellow googlers.
In my case, I want to have a tar file with only relative file names inside of it, which would work recursively. So, a zippable directory of
in zip would look like this:
By default, python
tarfile
will add/
as extra entry.My goal was to remove leading
/
entry in tar file, since it is considered an ZipSlip vulnerabilityWhen using tar with such vulnerability you will get an warning
I'm not sure why python
tarfile
library does not have easy way to handle this, but I came up with this code that does exactly what I want:如果您想在 tarfile 中添加目录名称而不是其内容,可以执行以下操作:
(1) 创建一个名为
empty
的空目录(2)
tf.add("empty", arcname=path_you_want_to_add)
这将创建一个名为
path_you_want_to_add
的空目录。If you want to add the directory name but not its contents inside a tarfile, you can do the following:
(1) create an empty directory called
empty
(2)
tf.add("empty", arcname=path_you_want_to_add)
That creates an empty directory with the name
path_you_want_to_add
.