7z

如何使用 7z 獲取存檔中的文件名

  • June 5, 2020

使用 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

引用自:https://unix.stackexchange.com/questions/591114