7z
如何使用 7z 獲取存檔中的文件名
使用 7z,我想列印存檔中文件的名稱。
的輸出
7z l myArchive.7z
是7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=en_US.utf8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz (206A7),ASM,AES-NI) Scanning the drive for archives: 1 file, 171329 bytes (168 KiB) Listing archive: myArchive.7z -- Path = myArchive.7z Type = 7z Physical Size = 171329 Headers Size = 237 Method = LZMA2:18 Solid = + Blocks = 1 Date Time Attr Size Compressed Name ------------------- ----- ------------ ------------ ------------------------ 2020-06-05 16:03:29 ....A 0 0 file with spaces 2020-06-05 11:53:13 ....A 96616 171092 screen_2020-06-05_11-53-13.png 2020-06-05 11:53:43 ....A 106932 screen_2020-06-05_11-53-43.png ------------------- ----- ------------ ------------ ------------------------ 2020-06-05 16:03:29 203548 171092 3 files
我想讓 7z 只列印文件名:
file with spaces screen_2020-06-05_11-53-13.png screen_2020-06-05_11-53-43.png
有沒有辦法做到這一點?
只需使用 libarchive 的
bsdtar
:bsdtar tf file.7z
另請注意,
7z l
如果存檔已加密,則會提示您輸入密碼,而bsdtar
只會返回錯誤,這在腳本中更可取。
和
-slt
這個命令
7z -slt l myArchive.7z | grep -oP "(?<=Path = ).+" | tail -n +2
印刷
file with spaces screen_2020-06-05_11-53-13.png screen_2020-06-05_11-53-43.png
-slt
選項“$$ s $$ets l(list)命令的技術模式”,根據手冊。 此選項使 7z 以可解析的方式列印有關存檔文件的資訊。
這是輸出
7z -slt l myArchive.7z
:Listing archive: file with spaces.7z -- Path = file with spaces.7z Type = 7z Physical Size = 171329 Headers Size = 237 Method = LZMA2:18 Solid = + Blocks = 1 ---------- Path = file with spaces Size = 0 Packed Size = 0 Modified = 2020-06-05 16:03:29 Attributes = A_ -rw-r--r-- CRC = Encrypted = - Method = Block = Path = screen_2020-06-05_11-53-13.png Size = 96616 Packed Size = 171092 Modified = 2020-06-05 11:53:13 Attributes = A_ -rw-r--r-- CRC = 41911DBA Encrypted = - Method = LZMA2:18 Block = 0 Path = screen_2020-06-05_11-53-43.png Size = 106932 Packed Size = Modified = 2020-06-05 11:53:43 Attributes = A_ -rw-r--r-- CRC = B0ECEA85 Encrypted = - Method = LZMA2:18 Block = 0
該命令的 grep 部分
| grep -oP "(?<=^Path = ).+"
需要解釋:
-o
: grep 只列印匹配的字元串,而不是整行。P
:在 grep 中啟用Perl 兼容的正則表達式。我們需要這個用於正則表達式的後視。(?<=^Path = ).+"
: grep 的正則表達式。獲取以“Path =”開頭的行之後的所有字元。該(?<=
部分是一個積極的向後看,這意味著該行必須以“Path =”開頭,但該字元串不是匹配的一部分。後面的字元是匹配的字元串。這些字元是文件名。之後,我們在第一行有存檔名稱,下面是所有文件名。我們用 刪除第一行
| tail -n +2
。