web-dev-qa-db-ja.com

Grep、警告を無視

特定のパッケージのインストールディレクトリを見つけようとしています。特定のファイルを見つけようとしている特定のキーワードがあります。

Grepでは、cppまたはhファイルタイプのみを含めます。 grepにwarnings likePermission DeniedまたはCould not findを表示させたくないディレクトリ。一致したファイルのみを表示したいだけです。どうすればこれを行うことができますか?

現在、私は使用しています

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
47
Neeraj Gupta

これらの警告は、標準出力ファイル記述子ではなく、stderrストリームに向けられます。コマンドの末尾に2>/dev/nullを追加することにより、stderr出力を無音にできます。

55

警告をフィルタリングするよりも直接、-sを追加して警告を無効にできます。

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

このオプションにはいくつかの互換性の問題があります。ただし、これは個人的な使用では問題になりません。

-s、-no-messages:存在しない、または読み取り不能なファイルに関するエラーメッセージを抑制します。移植性に関する注意:GNU grepとは異なり、7th Edition Unix grepはPOSIXに準拠していませんでした。これは、-qがなく、その-sオプションがGNU grepの-qオプションと同様に動作したためです。 USGスタイルのgrepにも-qがありませんでしたが、-sオプションはGNU grepのように動作しました。ポータブルシェルスクリプトは-qと-sの両方を避け、代わりに標準出力とエラー出力を/ dev/nullにリダイレクトする必要があります。 (-sはPOSIXで指定されます。)

28

私はこのような多くの迷惑なメッセージを取得していました。

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

その理由は、--directoriesフラグがデフォルトでreadに設定されているためです。 recurseに変更しました。自動的に再帰検索を実行したくない場合は、代わりにskipを使用できます。

これを常に処理する最も簡単な方法は、環境変数に設定することです。ディストリビューションに応じて~/.bash_profileまたは~/.bashrcで:

export GREP_OPTIONS='--directories=recurse'

現在、grepを使用するたびに、これらのメッセージが自動的に抑制されます。

別のオプションは、--no-messagesフラグ、短縮形-sです。これはIs a directoryメッセージも削除しますが、より有用な他のメッセージも抑制します。たとえば、*/*/*でネストされた検索を実行していて、そのパターンのそのようなファイルが存在しない場合、それは通知されません。

4
andrewtweber

-irを使用してgrepを再帰的に実行する代わりに、findコマンド(デフォルトでは再帰的)が-readableフラグと-not -path "*.svn*"フラグで除外するパスを使用して許可を処理し、grepにファイルを渡します。通常のファイルのみを見つけるために、-type fを介してディレクトリを除外します。

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 
0

特定のファイルで再帰検索を行うときは、ack-grepを使用するほうがはるかに適切です。ここの構文は次のとおりです。

ack-grep -i "My term" --cpp --h

アクセス許可エラーメッセージを削除するには、Sudoを使用して同じコマンドを実行できます。

ack-grep -i "My term" --cpp --h

しかし、最終的に、インストール済みのパッケージを検索する場合は、次のさまざまなオプションを確認してください。 https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

0
dargaud