在不解压的情况下更改 zip 中文件的权限

在不解压的情况下更改 zip 中文件的权限

有没有办法在不解压缩文件的情况下修改 zip 中文件的权限?澄清一下,我并不是要求更改文件的内容,而是要求更改文件中设置的 Unix 权限。除了提取和更新文件之外,我还没有找到答案。

答案1

是的,有时有。无需太深入地了解细节,Zip 文件有每个文件的条目列表,最后还有另一个条目总结它们。这些条目可能有也可能没有文件权限,这取决于工具(及其版本)、文件系统、Zip 格式……但如果有,您可以修改它们。

以下步骤在 Debian 10 上测试。

让我们创建一个 zip 文件:

$ echo "This is file 1" > file1.txt
$ chmod 777 file1.txt
$ echo "This is file 2" > file2.txt
$ chmod 555 file2.txt
$ zip files file?.txt

然后列出文件和权限:

$ zipinfo files.zip

Archive:  files.zip
Zip file size: 344 bytes, number of entries: 2
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:35 file1.txt
-r-xr-xr-x  3.0 unx       15 tx stor 20-Jun-08 18:30 file2.txt
2 files, 30 bytes uncompressed, 30 bytes compressed:  0.0%

现在,我们可以手动迭代条目,但有一个程序已经执行此操作并打印结果:

$ zipdetail files.zip

这会输出大量信息。左侧有偏移量,旁边有每个字段的名称和内容。

我们只想要Ext File Attributes每个文件:

$ zipdetails files.zip | egrep "Ext File Attributes|Filename"

001A Filename Length       0009
001E Filename              'file1.txt'
006C Filename Length       0009
0070 Filename              'file2.txt'
00C0 Filename Length       0009
00CA Ext File Attributes   81FF0000
00D2 Filename              'file1.txt'
010F Filename Length       0009
0119 Ext File Attributes   816D0001
0121 Filename              'file2.txt'

现在,让我们修改权限,file2.txt通过777写入0x81FF0000( 的文件属性 到file1.txt偏移量0x0119(十进制 281, 的文件属性file2.txt) 并考虑到字节顺序:

$ printf "\x00\x00\xff\x81" | dd of=files.zip bs=1 seek=281 count=4 conv=notrunc

并再次列出内容:

$ zipinfo files.zip
Archive:  files.zip
Zip file size: 344 bytes, number of entries: 2
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:35 file1.txt
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:30 file2.txt
2 files, 30 bytes uncompressed, 30 bytes compressed:  0.0%

现在两个文件共享相同的权限。

如果您想设置自己的权限,可以从 Zip 中的现有文件中复制它们或检查它们这里

答案2

这是不可能的。

ZIP 文件格式并非源自 UNIX 系统,因此它没有任何 UNIX 相关的权限支持。

相关内容