问题描述
tmp/
tmp/picture/
tmp/picture/1.jpg
我想用 chmod +x 将带有 python 文件的 tar.gz 文件添加到 tmp/logger.sh
我该怎么做?
import tarfile
with tarfile.open('test.tar.gz','w') as f:
f.add('logger.sh',arcname='/tmp/logger.sh')
这给了我 tar 文件 /tmp/logger.sh 文件,但删除了 tar 文件中的其余文件 + 我无法将 chmod +x 设置为该文件
解决方法
mode
可能必须明确设置为(默认为 r
):
tarfile.open('test.tar.gz','a')
另请参阅 tarfile.open 文档。
TarInfo
对象的文件权限设置可以通过 with TarInfo.mode
完成。
编辑:这里是长版:
$ python3.8
Python 3.8.0a1 (default,Feb 3 2019,20:37:37)
[GCC 7.3.0] on linux
Type "help","copyright","credits" or "license" for more information.
>>> import tarfile
>>> fh = tarfile.open('/tmp/test.tar.gz','w')
>>> fh.add("/home/chris/.zshrc")
>>> fh.add("/home/chris/.zcompdump")
>>> fh.list()
[...] home/chris/.zshrc
[...] home/chris/.zcompdump
>>> fh.close()
>>>
>>> fh = tarfile.open('/tmp/test.tar.gz','a')
>>> fh.add("/home/chris/.bashrc")
>>> fh.list()
[...] home/chris/.zshrc
[...] home/chris/.zcompdump
[...] home/chris/.bashrc
>>>
所以它只使用 a
而没有 :gz
就可以正常工作。
绝对最简单的解决方案是(临时?)chmod
添加文件之前。
正如您已经发现的那样,'w'
模式将覆盖任何现有文件。要更新现有存档,您希望以 'a'
模式打开文件。
但是,不幸的是,tarfile
库不支持在 gz
模式下打开 a
文件。如果您有未压缩的文件,则可以执行此操作:
import tarfile
def chmodx(tarinfo):
tarinfo.mode = int('0755',base=8)
return tarinfo
with tarfile.open('test.tar','a'):
f.add('logger.sh',arcname='/tmp/logger.sh',filter=chmodx)
gz
压缩的性质是这样的,您可能只想解压缩文件、更新它,然后重新压缩,而不是一次性完成所有操作。理想情况下,您希望在内存中执行此操作,但如果未压缩的 tar 文件很大,就会出现问题。
我认为最简单的方法是直接使用 tar 命令,如下所示:
import os
#Ici,on a newFilePath=tmp/logger.sh
command = "tar rf {1} {2} --mode=755".format(tarFilePath,newFilePath)
os.system(command)