使用Python的tarfile创建tar包时如何保留文件权限
大家好,StackOverflow的朋友们,
我想在使用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复制到Linux机器(通过samba映射):
shutil.copy("mytarball.tar.gz",unix_dir)
接着,在Linux上解压这个tar包,我是这样做的:
unix>tar -xvf mytarball.tar.gz
但是在解压后,我发现所有文件的“可执行”权限都没了。
有没有什么办法可以解决这个问题?
谢谢!
2 个回答
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
。
6
如果你知道哪些文件应该有执行权限,哪些不应该,你可以通过一个过滤函数手动设置这些权限:
def set_permissions(tarinfo):
tarinfo.mode = 0777 # for example
return tarinfo
tar.add('my_folder', filter=set_permissions)