我想获取 7z 存档根目录中包含的文件(包括目录)的数量,但7z
Linux 上的命令并没有提供一种简单的方法来仅获取数量并记录其他内容。
例如,我有7zarchive.7z
包含archive.tar
和 的文件archive.gzip
。然后,7z l 7zarchive.7z
打印以下详细行:
7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
p7zip Version 9.20 (locale=fr_FR.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Listing archive: 7zarchive.7z
--
Path = 7zarchive.7z
Type = 7z
Method = LZMA
Solid = +
Blocks = 1
Physical Size = 495
Headers Size = 184
Date Time Attr Size Compressed Name
------------------- ----- ------------ ------------ ------------------------
2016-03-14 22:43:10 ....A 20480 311 archive.tar
2016-03-14 23:04:01 ....A 163 archive.gzip
------------------- ----- ------------ ------------ ------------------------
20643 311 2 files, 0 folders
在右下角,你可以看到“2个文件,0个文件夹”,所以我想得到文件夹数量和文件数量的总和。
为此,我尝试了以下可怕的命令:
bash 7z l 7z l *.7z | tail -1 | sed -e 's/.* \([0-9]*\) files\, \([0-9]*\) folders/\1 \2/' -e 's/\([0-9]*\) \([0-9]*\)/\$(( \1 + \2))/' | tail -1 | sed -e 's/.* \([0-9]*\) files\, \([0-9]*\) folders/\1 \2/' -e 's/\([0-9]*\) \([0-9]*\)/\$(( \1 + \2))/'
tail
提取最后一行;- 第一个
sed
表达式提取单词“文件”和“文件夹”之前的数字。 - 第二个
sed
表达式将其格式化为这样打印$(( <first number> + <second number>))
。
所以,我确实获得了输出$(( 2 + 0))
,但我希望执行它以仅获得结果(2),而不是计算结果的命令。
那么,有一种方法可以做到这一点,或者至少有一种更简单的方法来获取 7z 存档包含的文件数量?
答案1
如果使用位置值会更简单,例如
7z l 7zarchive.7z | tail -n 1 |awk '{ print $3 + $5; }'
给出文件+文件夹的总数。
在最后一行
20643 311 2 files, 0 folders
$1
是“20643“,$2
是“311”,$3
是“2”,$4
是“文件,“,$5
是“0”并且$6
是“文件夹”。您可以使用正则表达式来匹配该行,使其更加明确。
答案2
我终于找到了,它比我想象的更简单:7z l -slt <nameof archive> | grep -c 'Path = [^/]*$'
。