使用 chmod +x python 将文件添加到 tar

问题描述

我有 tar.gz 文件,例如:

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)