そして-slt

そして-slt

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

これを行う方法はありますか?

答え1

libarchiveを使用してくださいbsdtar

bsdtar tf file.7z

また、7z lアーカイブが暗号化されている場合は、パスワードを入力するように求められ、bsdtarエラーのみが返されます。これはスクリプトで好ましい方法です。

答え2

そして-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]は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:できるようにするPerl互換正規表現grepから。正規表現から振り返るためにこれが必要です。
  • (?<=^Path = ).+":grepの正規表現です。 「Path=」で始まる行の後のすべての文字を取得します。この(?<=部分はアクティブバックビューつまり、その行は「Path =」で始まる必要がありますが、その文字列は一致の一部ではありません。次の文字は一致する文字列です。この文字はファイル名です。

その後、最初の行はアーカイブ名で、その下にはすべてのファイル名があります。最初の行を削除します| tail -n +2

関連情報