システム全体のすべての Python スクリプトとシェル スクリプトをカウントするにはどうすればよいでしょうか?

システム全体のすべての Python スクリプトとシェル スクリプトをカウントするにはどうすればよいでしょうか?

システム全体のすべての Python スクリプトとシェル スクリプトをカウントするにはどうすればよいでしょうか?

答え1

より具体的な目標がなければ、シェルスクリプトとPythonスクリプトの構成要素が曖昧なため、どのように実行しても近似値になってしまいます。だからといって問題があまりに曖昧になるわけではありません。近似値を求めるのであれば. そして、良い近似値を得ることができます。

これを踏まえて、シェル スクリプトと Python スクリプトを一覧表示するには、次のコマンドを使用することをお勧めします。

find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,'

出力がニーズに合っていると思われる場合は、結果の数をカウントするように変更して再度実行できます。

find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,' | wc -l

「アクセスが拒否されました」というエラーが表示される場合があります。問題ありません。これらのエラー メッセージを抑制しようとすることはお勧めしません。エラー メッセージを読んで、少なくともざっと目を通し、関心のあるファイルや場所にアクセスできなかったかどうかを確認する必要があります。必要な場合は、次のコマンドを使用しfindて、root としてコマンドを実行できます。sudo

  • -type f通常のファイルのみを検索します。通常は、通常のファイルに解決されるシンボリック リンクを含めるために を使用する方が適切です-xtype fが、この場合は過剰カウントが発生します。
  • -executableを実行するユーザーが実行可能なファイルのみを検索しますfind。実行可能でないファイルを調べて、それがシェルまたは Python スクリプトであるかどうかを確認すると、コマンドの実行時間がかなり長くなります。また、その方法では、実行可能でないファイルはスクリプトではなく「ライブラリ」である可能性があり、つまり、シェル コマンドで構成され、シェル スクリプトでソース化.またはシェル スクリプトに取り込むためのものであるか、Python プログラムでインポートまたはPython プログラムにsourceインポートする Python モジュールである可能性があるため、誤検出が増える可能性があります。(このようなファイルには一般にimportfromシバンですが、find単なる検索以上のものを検索します。ただし、-executable必要に応じて省略することもできます。待つ気があるならコマンドはシステム上のすべての通常ファイルの先頭を開いて読み取ろうとします。
  • -exec ... +...見つかったファイルをコマンドライン引数としてコマンドを実行します。すべてのファイルを処理するために必要な回数だけコマンドを実行します。多くの場合、これは 1 回だけです。システム全体のすべての実行可能ファイルに対しては、おそらく複数回実行されますが、ファイルごとに 1 回実行した場合 (-exec ... \;通常どおり) よりもはるかに少ない回数です。同じ数のファイルに対しても、コマンドを数回実行すると、関連するオーバーヘッドが少なくなるため、複数回実行するよりも大幅に高速になる傾向があります。
  • このfileコマンドはファイルの先頭を見て、それがどのようなファイルであるかを推測します。通常はかなり正確に推測します。出力は2列形式で、左側にパスまたはファイル名、左側にファイルの概要が表示されます。親切ファイルの右側に表示されます。
  • このコマンドは入力をフィルタリングし、大文字と小文字を区別せずに( )に一致するgrep行のみを出力します。-i拡張正規表現( -E) (python|shell) script,。これらは、テキストpython script,shell script,、またはそれらの大文字と小文字のバリエーションを含む行です。ファイルは、findこれらのタイプのスクリプトとして識別され、これを表示します。
  • wc -l上記の 2 つのコマンドのうち 2 番目に表示される は、行数をカウントします。

ご覧のとおり、この技術は多くのどのような種類のファイルを持っているかを判断するタスク。その理由は、ファイルpython script,名に のようなテキストや改行文字が含まれる場合があり、その場合、出力がfile1 行に 1 つではなくなるためです。こうした事柄を考慮することは通常重要であり、多くの場合不可欠であり、またそれは実行可能です。ただし、この場合、問題自体があいまいなため、単に見積もりをしようとしているだけであり、結果に直接基づいて名前を変更したり、修正したり、削除したり、何かを作成したりしていないように見えるため、それについて心配する価値はないと思います。これを繰り返して問題をより厳密に定義することになったら、それに対処する価値があるかもしれません。

実行可能でないファイルをスクリプトと見なす必要がある場合が 1 つあります。Windows などの実行可能としてマークされていないシステムから多くの Python スクリプトを持ち込んでいる場合です。その場合、.pyファイルを検索できますが、それらの多くは Python スクリプトではなく Python モジュールである可能性が高いことに注意してください。スクリプトの先頭にハッシュバンを配置するという Python の優れた慣例に従っている場合 (これは Windows でも役立ちます。 と がハッシュpy.exeバンpyw.exeを認識するためですが、残念ながら常に実行されるわけではありません)、ファイルが実行可能かどうかは無視してハッシュバンのみを検索する手法の方がニーズに適している可能性があります。

また、実行可能でないファイルをあらゆる種類のスクリプトと見なす必要がある、またはより正確には、実行可能性を別の方法でテストする必要がある場合など、小さいながらも重要なケースもあります。 がマウントされている場合、そのドライブ上のファイルはのテストnoexecに合格しません。 これは、一部のファイルを実行する権限を持たないユーザーとして実行する場合とは異なる問題であることに注意してください。一部のディレクトリを参照する権限を持たないユーザーとして実行する場合の問題と同様に、十分な権限を持つユーザーとして実行することで解決できます。find-executablefind


この問題、あなたが提案したように、珍しいですね--通常、特定の言語または密接に関連する言語の小さなファミリーの文字を見つけたいと思うでしょう。しかし、将来の読者のために、(たとえば)シェルスクリプトをすべて単一の、おそらく大きなディレクトリで検索することは、上記のコマンドを少し変更するだけでも実現できることに留意してください。(同じことは、WinEunuuchs2Unix の回答--それにも役立ちます。

たとえば、現在のディレクトリ内のすべてのシェル スクリプトを検索するには、次のようにします。

find . -type f -executable -exec file {} + | grep -Fi 'shell script,'

答え2

概要

実行方法に関するガイドラインは次のとおりです。

$ for f in * ; do file "$f" ; done

aptfielout: ASCII text, with very long lines
aptfilein: ASCII text, with very long lines
aptfileout: ASCII text
aptfileparse.sh: Bourne-Again shell script, ASCII text executable, with very long lines
aptfileparse.sh~: ASCII text, with very long lines
calc.py: Python script, UTF-8 Unicode text executable
catall.sh: Bourne-Again shell script, ASCII text executable

「Bourne-Again シェル スクリプト」または「Python スクリプト」と書かれていないファイルをすべて削除します。POSIX シェル スクリプトをリストに追加します。

$ file /bin/zgrep
/bin/zgrep: POSIX shell script, ASCII text executable

完全な答え

/$ time find * -type f -print0 2>/dev/null | xargs -0 -P 8 file | \
sed 's/.*: //g' | sed 's/^ *//g' | \
grep -Eio 'shell script,|Python script,' | sort | uniq -c  

  19151 Python script,                  
    127 python script,
  18420 shell script,

real    16m14.939s
user    54m7.355s
sys     2m33.238s

ルート ( /)から始めて、すべてのファイルを0 バイトで終了する名前としてコマンドfindにパイプします。xargs

このxargsコマンドは、処理を高速化するために 8 つの CPU を最大限に活用して並列に実行されます。各並列プロセスは、file前のセクションに示したようにファイルの説明を取得するコマンドを呼び出します。

このgrepコマンドは、シェル スクリプトと Python スクリプトを選択します。

このsortコマンドは、シェル スクリプトと Python スクリプトを一緒に並べ替えます。

このuniqコマンドは各グループの発生回数をカウントします。


おもしろ情報

私の場合、一度に 8 つの CPU すべてを実行すると、システムにかなりの負担がかかります。

xargs 8 コアを見つける.gif

Linux の素晴らしさは、スクリーン レコーダーによるビデオの作成や、3 番目のモニター (大画面テレビ) でのビデオの実行などの他のジョブが正常に機能し続けることから生まれます。Linux では、コマンドによってシステムが停止すること.gifはありません。xargs file

関連情報