質問
ファイルでいっぱいのgitリポジトリがあり、ほとんどはテキストです。
あるか知りたいです。
n
次に終わるファイルのコード行.py
m
次に終わるファイルのコード行.md
o
次に終わるファイルのコード行.yaml
p
ファイルのコード行拡張子なし- など
メモ:
- 再帰的に実行したいです。フォルダ内を確認してください。
.git
トップレベルフォルダのディレクトリを除外したいです。- バイナリファイルを無視することは可能です(拡張子のないテキストファイルと拡張子のないバイナリファイルの一部があります)。
- 大文字と小文字を区別したいです。
.csv
グループ.CSV
- 空行(または空行のみ)を無視したいです。
- 私と同じファイルがある場合は、
myfile.yaml.j2
グループ.j2
または.yaml.j2
。
ベストアンサー1
この試み:
find ./ -not -path "./.git/*" -type f -exec wc -l {} + |
awk '{print tolower($0)}' |
sed -e '$ d' |
sed -e "s#/.*/##g" |
sed -e "s/\./ \./g" |
awk '
{ if ( NF <= 2 ) { count["none"] += $1 } else { count[$NF] += $1 } }
{ next }
END { for (group in count) printf("%d%s%s\n", count[group], OFS, group) }
' |
sort -n
分割:
find ./
このディレクトリからオブジェクトを繰り返し検索します。-not -path "./.git/*"
入らないようにする.git
-type f
ディレクトリの代わりにファイル-exec wc -l {} +
各ファイルに対して単語数ユーティリティ(wc
)を実行します。これには空行が含まれているため、質問のすべての要件を満たしているわけではありません。awk '{print tolower($0)}'
小文字になるsed -e '$ d'
すべてのファイルの行の合計である最後の行を削除します。sed -e "s#/.*/##g"
たとえば、削除されたファイルへのパスは、拡張子ではなく拡張子がa/something.egg/blah
ないと計算する必要があります。.egg/blah
sed -e "s/\./ \./g"
ファイル拡張子が独自の単語になるように検索/.
置換する.
awk '{ if ( NF <= 2 ) { count["none"] += $1 } else { count[$NF] += $1 } } { next } END { for (group in count) printf("%d%s%s\n", count[group], OFS, group) }'
これは大きな問題です。awk
強力ですが、非常に鋭くはありません。count
辞書ですif (NF <= 2)
「単語」が3つ未満の場合、拡張子はありません。count["none"] += $1
辞書の要素を増分します。キーは文字列リテラルですnone
。最初の単語であるファイルの行数を追加して増分します。$1
count[$NF] += $1
辞書に要素を追加します。キーは$NF
(行の最後の単語)、拡張子は$1
(行の最初の単語)はファイルの行数です。{ next }
すべての行に対して繰り返しfor (group in count)
ループfor
、インラインprintf(...)
number extension
たとえば、出力文字列の形式を;で指定します123 .abc
(で終わるファイルに123行がある場合.abc
)。
sort -n
結果を昇順に並べ替えます。-n
文字列ではなく数字でソートすることを意味します。