質問

質問

質問

ファイルでいっぱいの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文字列ではなく数字でソートすることを意味します。

おすすめ記事