tgz圧縮ファイルから特定のファイル形式の行数を計算する方法は?

tgz圧縮ファイルから特定のファイル形式の行数を計算する方法は?

各.tgzファイルの合計行数を取得するのに役立つ次の投稿を見ましたが、すべてではなく、この圧縮された.tgzフォルダにある.jsファイルの行数だけを計算したいと思います。どうすればいいですか?

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

答え1

stdoutに一致するすべてのファイルを抽出し*.js、それを使用してwc -l行数を計算しようとしています。

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

-Oファイルをディスクに書き込むのではなく、stdoutとして出力します(tarが通常行うように)。

--wildcards抽出されたファイル名にワイルドカードを使用できます(LinuxではGNUのみ使用できますが)。

これで 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を指定します。

関連情報