web-dev-qa-db-ja.com

特定のファイルに対して再帰的にgrep

Grepを使用してpythonファイル内のいくつかのコードスニペットを見つけようとしましたが、それらはいくつかのディレクトリ/サブディレクトリに分散していますが、残念ながら私の試みは失敗しました:(

私は思った:

grep -r "search-pattern" *.py

魔法をするはずですが、検索パターンの行を含むファイルがいくつかありますが、「一致が見つかりません」で失敗しました。

次に、私は次を試しました:

grep -r "search-pattern" .

これは機能しているように見えましたが、いくつかのコンパイルされたCファイルやその他のものに対して多くのエラーを返しました。明らかに私が欲しかった以上。

最終的に、Googleで何度も検索した後、私は思いついた:

grep -rn --include="*.py" "search-pattern"

これは仕事をして、私が探していたすべてのpythonファイルを見つけました。ボーナスとして、検索パターンを含む行番号も出力します。

しかし、1つの問題が残っていました。いくつかの「許可が拒否されました」エラーです。どうすればそれらを取り除くことができますか? grepの処理は簡単だと思っていましたが、行番号を付けてエラーなくすてきな結果を得るのは複雑でした。

どんな助けも大歓迎です:)

4
daniel451

ユーザーに読み取り権限がないpythonファイルがいくつかあるため、これらのPermission deniedエラーが発生しているため、grepはnotこれらのファイルを処理しています(検索できません)。

Permission deniedエラーを「取り除いて」ください。

  1. 次のように、コマンドの最後に2>/dev/nullを追加できます。

    grep -rn --include="*.py" "search-pattern" 2>/dev/null
    

    これにより、すべてのエラーメッセージが抑制されるため、Permission deniedエラーがポップアップ表示されることはありません。しかし、これは明らかにgrepがそれらのファイルを検索していないことを意味しているため、検索パターンが含まれている場合、出力には表示されません。

    説明
    Linuxでは、 ファイル記述子と呼ばれるものが3つありますstdinstdoutstderr。コマンドを実行してエラーが発生した場合、エラーはファイル記述子stderrに書き込まれます。デフォルトでは、stderrは端末にエラーを出力します。したがって、できることは、エラーをリダイレクトすることです。つまり、端末ではなくstderrを別の場所にリダイレクトします。 Linuxでは、>記号を使用してものをリダイレクトします。それでは、stderrをどこにリダイレクトしますか? /dev/nullへ。 /dev/nullは特別なファイルです。ブラックホールと考えてください。リダイレクトするものはすべて破棄されます。最後に、stderrを単に番号2と呼びます。 2>/dev/nullは、2/dev/nullにリダイレクトするようLinuxに指示します。 1stdout(コマンドの通常の出力、つまりエラーではない)を意味します。そのため、たとえば、grepコマンドの実際の出力を端末に表示するのではなくファイルに保存する場合、1>/path/to/filenameを使用して、stdoutをそのファイルにリダイレクトできます。

  2. 特権があると仮定して、コマンドでSudoを使用します。

    Sudo grep -rn --include="*.py" "search-pattern"
    

    ユーザー名にroot権限がある場合(つまり、マシンの管理者である場合)、コマンドを実行する前にSudoを使用してrootユーザーとして実行するため、Permission deniedエラーとgrepwillは、それらのファイルを検索し、その中に見つかった場合は検索パターンを出力します。

3
Alaa Ali

これはよくある問題です。コマンドラインから直接解決できます。
--devices=skipを使用して、特殊なデバイスファイル(多くのシステムでエラーや無限ループの原因)を無視できます。
Sudo chown -R new_owner_name file_patternを実行して、ファイルの所有権を再帰的に変更し、許可エラーを回避します。
COMMAND 2> DESTINATION_OR_/dev/nullを使用してエラーストリームをリダイレクトすると、エラーが引き続き発生し、grepから目的の結果が得られません。
可能であれば、Sudoを自動的に使用しないでください分析を行う(システムの弱点になる可能性があります)場合、必要に応じてファイルの所有権を変更してください。ユーザーに許可を求める必要がある場合は、Sudoのグラフィカルバージョンを使用できます。

さらに固有の質問がある場合は、ここでコメントしてください。助けが必要な場合は、左の上矢印を押すことを忘れないでください。
ごきげんよう。

1
Lorenzo Ancora