tgz 圧縮ファイル内の特定のファイルタイプの行数をカウントするにはどうすればよいですか?

tgz 圧縮ファイル内の特定のファイルタイプの行数をカウントするにはどうすればよいですか?

各 .t​​gz ファイルの合計行数を取得するのに役立つ以下の投稿を見ましたが、この圧縮された .tgz フォルダー内のすべての .js ファイルの行数ではなく、行数のみをカウントしたいです。どうすればいいですか?

https://stackoverflow.com/questions/22064932/count-number-of-lines-of-gz-files-recursviely-on-directory

答え1

*.jsstdout に一致するすべてのファイルを抽出し、wc -l行数をカウントするために使用します。

tar -x -f file.tgz -O --wildcards '*.js' | wc -l

-Otar が通常行うようにファイルをディスクに書き込む代わりに、stdout に出力します。

--wildcards抽出されるファイル名にワイルドカードを使用できます (これは GNU のみである可能性がありますが、Linux でも同じです)。

これにより、単一の tar ファイルが実行されます。複数の tar ファイルがある場合は、ループで実行し、ループの出力を にパイプすることができますwc -l

答え2

.js圧縮された tar アーカイブ内の各ファイルの行数を取得するには、次を試してください。

tar -xf file.tgz --to-command='echo " $TAR_FILENAME $(wc -l)"' --wildcards '*.js'

デモとして、このアーカイブから始めましょう:

$ tar --list -f file.tgz
a.js
dir1/
dir1/b.js
other.txt

次に、アーカイブ内の各 js ファイルの行数を取得してみましょう。

$ tar -xf file.tgz --to-command='echo " $TAR_FILENAME $(wc -l)"' --wildcards '*.js' 
 a.js 10
 dir1/b.js 15

改善

出力のフォーマットをもっときれいにしたい場合は、printfの代わりに以下を使用できますecho:

$ tar -xf file.tgz --to-command='printf "%-10s %s\n" "$TAR_FILENAME" "$(wc -l)"' --wildcards '*.js' 
a.js       10
dir1/b.js  15

使い方

  • -xtar にファイルを抽出するよう指示します。

  • -f file.tgztar に から抽出するように指示しますfile.tgz

  • --to-command='echo "$TAR_FILENAME $(wc -l)"'tar に、抽出された各ファイルにこのコマンドを適用するように指示します。tar は環境変数で各ファイルの名前を提供します$TAR_FILENAME

  • --wildcardstar に、glob を使用して抽出するファイルを選択するように指示します。

  • '*.js'抽出するファイル glob を指定します。

関連情報