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

6

大家好,

我希望在使用Python的tarfile模块时保留原始文件权限。我有很多可执行文件,但是一旦解压缩tar包,它们就会失去它们的权限。

我正在尝试以下操作:

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

然后我使用shutil将它从Windows复制到映射有Samba的Linux机器上:

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

然后,在Linux中提取tarball,我执行以下操作:

unix>tar -xvf mytarball.tar.gz  

在解压tar包后,我的文件失去了所有的“x”权限。有什么办法可以解决这个问题吗?
谢谢。

我使用了你的代码进行了一个小测试,它保留了“x”权限。是否有更复杂的情况发生?在将权限添加到tarball之前,您确定权限是正确的吗? - Dan Getz
我正在通过Samba将tarball从Windows复制到Unix。我正在使用shutil:shutil.copy(“mytarball.tar.gz”,unix_dir)可能有一些问题。我需要再次检查。但是,复制单个文件似乎有效。权限得到保留。 - user3352256
啊,好的,我的测试只在Linux上进行过,在那里我知道如何执行文件权限。不确定Python在Windows上如何处理执行文件权限。 - Dan Getz
因为在Linux和Windows上,“可执行文件”可能具有不同的含义,您认为应该如何确定哪些文件具有可执行权限? - Dan Getz
shutil正在执行其工作。换句话说,通过samba从Windows复制文件到Unix不会更改权限。问题似乎是tarfile模块,在Windows下运行时忽略权限。我在Windows中提取了tarball并观察到权限已经消失。 - user3352256
我认为在提取tar文件时,无论它是否保存了原始权限,如果你想要提取的文件具有保存的权限,那么你必须使用p标志。例如:tar -xvpf mytarball.tar.gz - Brōtsyorfuzthrāx
2个回答

6

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

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

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

找不到适合我的Windows文件的正确过滤器。tarball始终为空。 :( - user3352256
我的错,我想是我忘了从我的示例过滤器中返回tarinfo对象。返回None将会将其过滤出结果tarball,是的。 - Dan Getz

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://dev59.com/pXI-5IYBdhLWcg3w48xP#1627222

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接