Linuxはパイプラインで「検索」を適用できません。

Linuxはパイプラインで「検索」を適用できません。

以下のディレクトリツリーでファイルを検索しています。試してみるとfind . -name xyz画面がいっぱいです。find: '/home/fred' : Permission denied

私はこのディレクトリにアクセスできないので、これは意味があります。だから私は努力します

find . -name xyz | grep -v Permission 

これにより、不要な行が削除されます。まあ、私の画面は以前と同じです。 grepは何もしません

どうなりますか?どうすれば解決できますか?

答え1

「権限が拒否されました」は警告であり、予想されるデータの種類ではありませんfind。要求されたユーザーデータからエラーメッセージを分離するために、findファイル名は標準出力チャネル1に印刷され、警告は標準エラーチャネル2に印刷されます。この動作は、多くのUNIXコマンドラインツールで非常に一般的です。シェルには通常2つのチャンネルが表示されます。/dev/null次のように表示されるvoidなど、エラーストリームを別の場所に明示的にリダイレクトすることでこれを回避できます。

find . -name xyz 2>/dev/null

答え2

問題は、標準出力でエラーメッセージをフィルタリング(削除)しようとしていることですfind。エラーメッセージ(一般的な診断メッセージと対話型プロンプトを含む)は標準エラーストリームに表示され、パイプできません。したがって、grep標準エラーストリームを標準出力ストリームにマージしないとエラーメッセージを抑制できません。

GNUの使用find(非標準-readableテストの実装):

find . -type d ! -readable -prune -o -name xyz -print

xyzこれは、現在のディレクトリまたはその下で呼び出されたすべてのエントリを検索し、見つかったパス名を印刷します。find現在のユーザーに読み取り権限がないディレクトリが見つかるたびに、そのディレクトリは検索ツリーから削除されます(検索ツリーは手入れされたそして-prune)。

これにより、アクセスできないディレクトリにアクセスしようとしたときに発生する「許可拒否」エラーが排除されます。これは、単にこれらのエラーが発生する可能性がある状況に陥らないことによって行われます。

これにより、文字通り名前付きgrepディレクトリにあるファイルを誤ってフィルタリングすることを防ぐことができますPermissionその他xyz検索(エラーが何であれ)、find ... -exec ...実行時にエラーフローを使用する必要があるインラインスクリプトを作成するとき、または特定のタスクをfind ... -ok ...実行する前にユーザーに確認を要求したときに生成される可能性があるエラーです。

関連情報