使用python zipfile归档符号链接

Lar*_*ell 4 python zipfile python-2.7

我有一个脚本,可以创建包含符号链接的目录的zip文件。我惊讶地发现zipfile压缩了链接的目标,而不是链接本身,这是我想要和期望的。有人知道如何获取zipfile来压缩链接吗?

Max*_*tin 6

请查找完整的 Python 代码作为工作示例,该示例使用指向 的cpuinfo.zip符号链接创建存档。cpuinfo.txt/proc/cpuinfo

#!/usr/bin/python

import stat
import zipfile

def create_zip_with_symlink(output_zip_filename, link_source, link_target):
    zipInfo  = zipfile.ZipInfo(link_source)
    zipInfo.create_system = 3 # System which created ZIP archive, 3 = Unix; 0 = Windows
    unix_st_mode = stat.S_IFLNK | stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IWOTH | stat.S_IXOTH
    zipInfo.external_attr = unix_st_mode << 16 # The Python zipfile module accepts the 16-bit "Mode" field (that stores st_mode field from struct stat, containing user/group/other permissions, setuid/setgid and symlink info, etc) of the ASi extra block for Unix as bits 16-31 of the external_attr
    zipOut = zipfile.ZipFile(output_zip_filename, 'w', compression=zipfile.ZIP_DEFLATED)
    zipOut.writestr(zipInfo, link_target)
    zipOut.close()

create_zip_with_symlink('cpuinfo.zip', 'cpuinfo.txt', '/proc/cpuinfo')
Run Code Online (Sandbox Code Playgroud)

您可以进一步发出以下命令(例如在 Ubuntu 下)来查看存档如何解压到工作符号链接:

unzip cpuinfo.zip
ls -l cpuinfo.txt
cat cpuinfo.txt
Run Code Online (Sandbox Code Playgroud)


iva*_*eev 5

zipfile似乎不支持存储符号链接。将它们存储在 ZIP 中的方式实际上不是格式的一部分,仅在某些实现中作为自定义扩展可用。特别是,Info-ZIP 的实现支持它们,因此您可以委托给它。确保你的解压软件可以处理这样的档案——正如我所说,这个功能不是标准化的。


Mue*_*ito 5

zipfile可能存储符号链接,而不是文件本身。有关示例,请参见此处。脚本的相关部分将符号链接属性存储在zipinfo中:

zipInfo = zipfile.ZipInfo(archiveRoot)
zipInfo.create_system = 3
# long type of hex val of '0xA1ED0000L',
# say, symlink attr magic...
zipInfo.external_attr = 2716663808L
zipOut.writestr(zipInfo, os.readlink(fullPath))
Run Code Online (Sandbox Code Playgroud)

  • python3 不区分 longs 和 ints,所以 `zipInfo.external_attr = 0xA1ED0000L` 应该可以工作(哪个更易读?) (3认同)
  • 我看到了更好的实现:`zipInfo.external_attr |= 0xA0000000` (2认同)