「def test」を含むすべてのPythonテストスクリプトを一覧表示する方法

「def test」を含むすべてのPythonテストスクリプトを一覧表示する方法

「def test」を含むすべてのPythonテストスクリプトをリストしたいと思います。

コマンドラインは機能しませんが、単一のコマンドは機能します。

find . -name "*.py" | grep "def test"

答え1

努力する:

grep -r --include '*.py' 'def test'
  • -rgrepにファイルを再帰的に検索するように指示する

  • --include '*.py'で終わる名前だけを確認するようにgrepに指示します.py

--includeどちらもこのオプションをサポートします。GNU(Linux) grepそしてMacOS grep

パイプライン法に関する議論

次のコマンドでは、findは見つかったファイルの名前をgrepの標準入力に渡します。

find . -name "*.py" | grep "def test"

ここでの問題は、grepが標準入力を検索するテキストとして扱うことです。したがって、唯一の出力は対応するファイルです。名前(コンテンツと反対)にはdef test

たとえば、空のファイルを作成しましょう。

$ touch 'def test.py'

パイプラインコマンドを実行します。

$ find . -name "*.py" | grep "def test"
./def test.py

このコマンドは、名前に基づいてファイルを検索します。その内容はレビューされたことがありません。

答え2

find . -name '*.py' -exec grep -l 'def test' {} \;

または

find . -name '*.py' -exec grep -l 'def test' {} +

grep2 番目のバージョンでは、ファイルセットを引数として指定して呼び出しを減らします。

答え3

grep -ril 'def test' .

上記のコマンドは、探しているものを一覧表示します。

コマンドで - オプション ril は、再帰 (r) 大文字と小文字を区別しない (i) 検索およびリストのみ (l) ファイル名を表します。

答え4

見つかったファイルからコマンドを実行する標準的な方法は、findxargsを使用することです。

find . -name "*.py" | xargs grep "def test"

grepの場合は、他の回答で説明したように、find + grepの代わりに再帰的なgrepを使用できますが、xargsは他のユースケースにも使用できる一般的なアプローチなので、知っておくことをお勧めします。

(Doug O'Nealが述べたように:ファイル名にスペースがある場合は、findとxargsにNULL文字を終端として使用するように指示する必要があります。find . -name "*.py" -print0 | xargs -0 grep "def test"

関連情報