web-dev-qa-db-ja.com

7zでファイル数を取得する方法

7zアーカイブのルートに含まれるファイル(含まれるディレクトリ)の数を取得したいのですが、Linuxの_7z_コマンドでは、数を取得するだけの簡単な方法はありません。

たとえば、_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))/'

  1. tail最後の行を抽出します。
  2. 最初のsed式は、「files」および「folders」という単語の前の数値を抽出します。
  3. 2番目のsed式は、この$(( <first number> + <second number>))のように出力されるようにフォーマットします。

したがって、実際には出力$(( 2 + 0))を取得しますが、結果を計算するコマンドではなく、結果(2)のみを取得するように実行する必要があります。

それで、これを行う方法がありますか、またはリストで、7zアーカイブに含まれるファイルの数を取得するためのより簡単な方法がありますか?

1
fauve

私はついにそれを見つけました、私が想像するより簡単でした:7z l -slt <nameof archive> | grep -c 'Path = [^/]*$'

0
fauve

位置の値を使用すると、より簡単になります。たとえば、

7z l 7zarchive.7z | tail -n 1 |awk '{ print $3 + $5; }'

ファイルとフォルダの合計を表示します。

最後の行で

20643          311  2 files, 0 folders

$1 is "2064"、$2 is "311"$3 is "2"$4 is "files、"、$5 is "0" and $6 is "folders"。正規表現を使用して行に一致させることで、より明確にすることができます。

1
Thomas Dickey