有没有办法使用 shell 命令来找到 zip 文件中文件的偏移量,而无需实际解压 zip 文件?
已尝试使用 zipinfo XXX.zip,它提供的大小必须加起来才能找到文件。
有没有更好的方法呢?
答案1
尝试运行邮编详情在文件上。[全面披露 - 我是 zipdetails 的作者]
在下面的例子中,文件的偏移量abc.txt
列在行上PAYLOAD
。本例中的值为 41 十六进制
$ echo abc >abc.txt
$ zip test.zip abc.txt
adding: abc.txt (stored 0%)
$ zipdetails test.zip
0000 LOCAL HEADER #1 04034B50
0004 Extract Zip Spec 0A '1.0'
0005 Extract OS 00 'MS-DOS'
0006 General Purpose Flag 0000
0008 Compression Method 0000 'Stored'
000A Last Mod Time 52984C29 'Sat Apr 24 09:33:18 2021'
000E CRC 4788814E
0012 Compressed Length 00000004
0016 Uncompressed Length 00000004
001A Filename Length 0007
001C Extra Length 001C
001E Filename 'abc.txt'
0025 Extra ID #0001 5455 'UT: Extended Timestamp'
0027 Length 0009
0029 Flags '03 mod access'
002A Mod Time 6083D7CE 'Sat Apr 24 09:33:18 2021'
002E Access Time 6083D7CE 'Sat Apr 24 09:33:18 2021'
0032 Extra ID #0002 7875 'ux: Unix Extra Type 3'
0034 Length 000B
0036 Version 01
0037 UID Size 04
0038 UID 000003E8
003C GID Size 04
003D GID 000003E8
0041 PAYLOAD abc.
0045 CENTRAL HEADER #1 02014B50
0049 Created Zip Spec 1E '3.0'
004A Created OS 03 'Unix'
004B Extract Zip Spec 0A '1.0'
004C Extract OS 00 'MS-DOS'
004D General Purpose Flag 0000
004F Compression Method 0000 'Stored'
0051 Last Mod Time 52984C29 'Sat Apr 24 09:33:18 2021'
0055 CRC 4788814E
0059 Compressed Length 00000004
005D Uncompressed Length 00000004
0061 Filename Length 0007
0063 Extra Length 0018
0065 Comment Length 0000
0067 Disk Start 0000
0069 Int File Attributes 0001
[Bit 0] 1 Text Data
006B Ext File Attributes 81B40000
006F Local Header Offset 00000000
0073 Filename 'abc.txt'
007A Extra ID #0001 5455 'UT: Extended Timestamp'
007C Length 0005
007E Flags '03 mod access'
007F Mod Time 6083D7CE 'Sat Apr 24 09:33:18 2021'
0083 Extra ID #0002 7875 'ux: Unix Extra Type 3'
0085 Length 000B
0087 Version 01
0088 UID Size 04
0089 UID 000003E8
008D GID Size 04
008E GID 000003E8
0092 END CENTRAL HEADER 06054B50
0096 Number of this disk 0000
0098 Central Dir Disk no 0000
009A Entries in this disk 0001
009C Total Entries 0001
009E Size of Central Dir 0000004D
00A2 Offset to Central Dir 00000045
00A6 Comment Length 0000
Done
只需转储文件名和有效载荷偏移量即可,如下所示
$ zipdetails test.zip | perl -00 -ne 'print "$1,$2\n" if /^\S+\s+Filename\s+'"'"'(.*?)'"'"'.*?^(\S+?)\s+PAYLOAD/ms'
abc.txt,0041
其中有一堆 shell 转义,所以这里是没有转义的 perl 语句
print "$1,$2\n"
if /^\S+\s+Filename\s+'(.*?)'.*?^(\S+?)\s+PAYLOAD/ms;