各.tgzファイルの合計行数を取得するのに役立つ次の投稿を見ましたが、すべてではなく、この圧縮された.tgzフォルダにある.jsファイルの行数だけを計算したいと思います。どうすればいいですか?
答え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
どのように動作しますか?
-x
tarにファイルを抽出するように指示します。-f file.tgz
tarから抽出するように指示しますfile.tgz
。--to-command='echo "$TAR_FILENAME $(wc -l)"'
抽出された各ファイルにこのコマンドを適用するようにtarに指示します。 Tarは環境変数に各ファイルの名前を提供します$TAR_FILENAME
。--wildcards
tarにglobを使用して抽出するファイルを選択するように指示します。'*.js'
抽出するファイルglobを指定します。