findとgrepを使用して文字列を再帰的に取得するときに「許可されていません」エラーメッセージを防ぐ方法は?

findとgrepを使用して文字列を再帰的に取得するときに「許可されていません」エラーメッセージを防ぐ方法は?

私は使う

find -type f -print0 | xargs -0 -n 10 grep -i searchstring

...再帰的に文字列を検索します。しかし、「権限が拒否されました」などのエラーメッセージも表示されました。これらのエラーメッセージを回避し、結果のみを表示する方法は何ですか?

答え1

標準エラーを/dev/nullにリダイレクトします。つまり

find -type f -print0 2>/dev/null | xargs -0 -n 10 grep -i searchstring 2>/dev/null

答え2

エラーメッセージがfindから出てくる場合(たとえば、ナビゲートできないディレクトリがあるため、そのエラーにリダイレクトします)/dev/null

find -type f -print0 2>/dev/null | …

エラーメッセージがgrepから出てくる場合(たとえば、一部のファイルを読み取ることができないため)、そのエラーにリダイレクトするか、読み取れないファイルを無視するように指示するオプションを/dev/null渡します。-s

xargs -0 grep -s -i searchstring /dev/null

ただし、常に少なくとも2つのファイルを表示できるようにgrep追加する必要があります。それ以外の場合は、ファイル引数が1つしかない場合、ファイル名は出力から省略されます。 GNU grepまたはBusybox(LinuxまたはCygwinなど)の場合は、このオプションを使用できます。/dev/nullgrepgrep-H

答え3

アクセス権を持つディレクトリのみを検索し、読み取ることができるファイルのみを確認するには、GNU find(質問で使用されているもの)を使用して、出会ったすべてのディレクトリに対するアクセスおよび読み取り権限があるかどうかを-executableテストできます。-readableディレクトリに対するこれらの権限がない場合は、-prune検索ツリーでパスを検索できます。残りのファイルはすべてテストされ、読み取り可能で-readableあることが確認されます。

これにより、「許可拒否」エラーが発生するのを防ぐことができますが、発生する可能性のある他のエラーは非表示になりません。考える確認する:

find . \
    -type d ! \( -readable -executable \) -prune -o \
    -type f -readable -exec grep -F -i searchstring {} +

私はgrep見つかったすべてのファイルに対してユーティリティを呼び出すことを避けるために、一括して通常のファイルのパス名を提供します。また、正規表現として解釈されないものを使用してクエリが実行されたことを示唆するために-Fwithを使用します。grepsearchstring

関連情報