【问题标题】:add file to tar with chmod +x python使用 chmod +x python 将文件添加到 tar
【发布时间】:2020-12-30 12:51:56
【问题描述】:

我有 tar.gz 文件,例如:

tmp/
tmp/picture/
tmp/picture/1.jpg

我想用 python 文件添加到这个 tar.gz 文件到 tmp/logger.sh 用 chmod +x

我该怎么做?

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 设置为此文件

【问题讨论】:

  • 'w' 标志到open 肯定会覆盖;你想要'a'。您可以使用 filter 覆盖 TarInfo.mode,但更简单和明显的解决方法是在将文件添加到存档之前将其 chmod
  • @tripleee 想这样做吗? ,我无法为 tarfile.open 设置 a
  • 为什么不呢?这就是文档清楚地表明的内容。如果该文件不存在,那么您当然不能附加到它,但这不符合您的问题描述。

标签: python tar chmod


【解决方案1】:

最简单的解决方案是(暂时?)chmod 在添加文件之前。

正如您已经发现的那样,'w' 模式将覆盖任何现有文件。要更新现有存档,您希望改为以'a' 模式打开文件。

但是,不幸的是,tarfile 库不支持在a 模式下打开gz 文件。如果你有一个未压缩的文件,你可以这样做:

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.gz 制定解决方案,但有一个我无法快速找出的错误。它总是无法复制所有存档成员。正在进行的工作:ideone.com/0bgM9S
【解决方案2】:

mode 可能必须像这样显式设置(默认为 r):

tarfile.open('test.tar.gz','a')

另见tarfile.open docs。

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 就可以正常工作。

【讨论】:

  • 这给了我相同的结果,tar.gz 只有 1 个文件,tar.gz 中的其余文件已删除
  • 对不起,当然应该是a 用于追加,就像所有file.open 一样。更新了答案。
  • ValueError: mode must be 'r' , 'w', or 'x'
  • 在没有:gz 的情况下工作,只在a 下工作。
【解决方案3】:

我认为最简单的方法是直接使用 tar 命令,如下所示:

import os
#Ici, on a newFilePath=tmp/logger.sh

command = "tar rf {1} {2} --mode=755".format(tarFilePath,newFilePath)
os.system(command)

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多