使用 Python 的 tarfile 创建 tarball 时保留文件权限

Posted

技术标签:

【中文标题】使用 Python 的 tarfile 创建 tarball 时保留文件权限【英文标题】:preserving file permission when creating a tarball with Python's tarfile 【发布时间】:2014-06-16 20:07:26 【问题描述】:

你好 ***ers,

我想在使用 Python 的 tarfile 模块时保留原始文件权限。 解压压缩包后,我有很多可执行文件会失去权限。

我正在做这样的事情:

import tarfile
tar = tarfile.open("mytarball.tar.gz", 'w:gz')
tar.add('my_folder') #tar the entire folder 
tar.close()

然后我使用shutil将它从windows复制到linux机器(用samba映射):

shutil.copy("mytarball.tar.gz",unix_dir)

然后,在 linux 中解压 tarball

unix>tar -xvf mytarball.tar.gz  

解压压缩包后,我失去了对文件的所有“x”权限

任何线索如何解决这个问题?

问候

【问题讨论】:

我用你的代码做了一个小测试,它保留了'x'权限。有没有更复杂的事情发生?在将权限添加到 tarball 之前,您确定权限是正确的吗? 我正在通过 samba 将 tarbal 从 windows 复制到 unix。我正在使用 shutil : shutil.copy("mytarball.tar.gz",unix_dir) 那里可能发生了什么事。我必须仔细检查。但是复制单个文件似乎可行。权限被保留。 啊,好吧,我的测试只在我知道执行文件权限如何工作的 Linux 上进行。不确定 Python 如何处理 Windows 上的执行文件权限。 因为“可执行”在Linux和Windows上可以有不同的含义,您认为应该如何确定哪些文件具有可执行权限? shutil 正在做它的工作。换句话说,通过 samba 将文件从 windows 复制到 unix 不会更改权限。问题似乎是 tarfile 模块,如果在 Windows 下运行,它会忽略权限。我在 Windows 中提取了 tarball,发现权限已经消失。 【参考方案1】:

基于@DanGetz 解决方案,我为python3.8 完成了这项工作:

我正在使用流响应来创建我的 tar 文件,但这里有完整的代码。

tar_stream = io.BytesIO()
tar = tarfile.TarFile(fileobj=tar_stream, mode='w')
file_data = content.encode('utf8')
tarinfo = tarfile.TarInfo(name=file_name)
tarinfo.size = len(file_data)
tarinfo.mtime = time.time()
tarinfo.mode = 0o740 # <--------
tar.addfile(tarinfo, io.BytesIO(file_data))
tar.close()

在 python 2.6 和 3+ 中,您必须使用这种格式来获取权限: 0o777 而不是 0777

来自:https://***.com/a/1627222/6809926

【讨论】:

【参考方案2】:

如果您知道哪些文件应该具有执行权限,您可以使用过滤功能手动设置权限:

def set_permissions(tarinfo):
    tarinfo.mode = 0777 # for example
    return tarinfo

tar.add('my_folder', filter=set_permissions)

【讨论】:

找不到适合我的 windows 文件的过滤器。压缩包总是空的。 :( 我认为是我的错!忘记从我的示例过滤器中返回 tarinfo 对象。返回 None 会将其从生成的 tarball 中过滤掉,是的。

以上是关于使用 Python 的 tarfile 创建 tarball 时保留文件权限的主要内容,如果未能解决你的问题,请参考以下文章

tarfile/zipfile/shutil

使用 Python 从仅具有基本名称的 tarfile 中提取文件

带有 bz2 数据的 Python TarFile

使用 Python 的 tarfile 时覆盖现有的只读文件

Python中使用tarfile压缩解压tar归档文件示例(最新+全面=强烈推荐! ! !)

Python_面向对象_zipfile和tarfile