私は使う
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/null
grep
grep
-H
答え3
アクセス権を持つディレクトリのみを検索し、読み取ることができるファイルのみを確認するには、GNU find
(質問で使用されているもの)を使用して、出会ったすべてのディレクトリに対するアクセスおよび読み取り権限があるかどうかを-executable
テストできます。-readable
ディレクトリに対するこれらの権限がない場合は、-prune
検索ツリーでパスを検索できます。残りのファイルはすべてテストされ、読み取り可能で-readable
あることが確認されます。
これにより、「許可拒否」エラーが発生するのを防ぐことができますが、発生する可能性のある他のエラーは非表示になりません。考える確認する:
find . \
-type d ! \( -readable -executable \) -prune -o \
-type f -readable -exec grep -F -i searchstring {} +
私はgrep
見つかったすべてのファイルに対してユーティリティを呼び出すことを避けるために、一括して通常のファイルのパス名を提供します。また、正規表現として解釈されないものを使用してクエリが実行されたことを示唆するために-F
withを使用します。grep
searchstring