以下のディレクトリツリーでファイルを検索しています。試してみると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 ...
実行する前にユーザーに確認を要求したときに生成される可能性があるエラーです。