
「def test」を含むすべてのPythonテストスクリプトをリストしたいと思います。
コマンドラインは機能しませんが、単一のコマンドは機能します。
find . -name "*.py" | grep "def test"
答え1
努力する:
grep -r --include '*.py' 'def test'
-r
grepにファイルを再帰的に検索するように指示する--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' {} +
grep
2 番目のバージョンでは、ファイルセットを引数として指定して呼び出しを減らします。
答え3
grep -ril 'def test' .
上記のコマンドは、探しているものを一覧表示します。
コマンドで - オプション ril は、再帰 (r) 大文字と小文字を区別しない (i) 検索およびリストのみ (l) ファイル名を表します。
答え4
見つかったファイルからコマンドを実行する標準的な方法は、find
xargsを使用することです。
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"
)