検索プログラムから「許可が拒否された」印刷出力ステートメントを削除するにはどうすればよいですか?


回答:


35

それらのメッセージはstderrに送信され、それらのメッセージだけが一般的にその出力ストリームに表示されます。これを閉じるか、コマンドラインでリダイレクトできます。

$ find / -name netcdf 2>&-

または

$ find / -name netcdf 2>/dev/null

また、ルートディレクトリ(/)を検索する場合は、findがすべてのリソースを消費しないようにプロセスを改善することをお勧めします。

$ nice find / -name netcdf 2>&-

これにより、プロセスの優先順位が下がり、他のプロセスがCPUでより多くの時間を使用できるようになります。もちろん、CPUを使用しているものが他にない場合は、何もしません。:)技術的には、NI値(から見たps -l)はPRI値を増やします。PRI値が低いほど、優先順位が高くなります。と比較ps -lしてくださいnice ps -l


1
警告を投げるのは好きではありません。それらを処理する方がはるかに優れています。また、フィールドでここに逃げることはありません。
レオレオポルトヘルツ준영

1
@LéoLéopoldHertz준영まあ...あなたの画面がエラーでいっぱいだからプログラムの出力を見ることができないなら..これはそうです...
chrips

20

@Gillesがこの許可を指摘したいのは、アクセス許可について文句を言うパスを除外する -Unix &Linux Stack Exchange ; それは基本的に、find読み取り不可能なディレクトリを下回らないようにするための構造を含んでおり、その意味で、おそらく少し高速です。

これは私にとってはうまくいくようです:

GNU findまたはその他の述語と述語findをサポートしている場合:-readable-executable

find / -type d ! \( -readable -executable \) -prune -o -type f -name netcdf -print

またはこれも:

find / -type d ! -perm -g+r,u+r,o+r -prune -o -type f -name 'netcdf' -print

何らかの理由で、すべてを追加する必要がありますg+r,u+r,o+r(そのショートカットはですa+r)。そうしないと、そのうちの1つが除外された場合でも、「Permission Denied」ヒットが表示される場合があります。

これがどのように見えるかの内訳です(2つの述語の間の-a(および)演算子find暗黙的であることに注意してください):

find /         # find starting from path /
  -type d        # match type is directory
  ! -perm -a+r   # (and) match not permissions of `r`ead present 
  -prune         # ignore what matched above and do not descend into it
  -o             # or (whatever didn't match above)
  -type f        # match type is file
  -name 'netcdf' # (and) match name is 'netcdf'
  -print         # print what matched above

最後のなしでは-print、いくつかの余分な項目が表示されることに注意してください(これはに関係ありません-name 'netcdf')。これ-printにより、一致する名前のみが出力されます(存在する場合)。


2
find(1)ディレクトリに降りることができない場合はありません。したがって、事前にそれが可能かどうかをチェックすると、作業が追加されるだけで(2回チェック)、速度が低下します。
フォンブランド14年

3
あなたが依存している場合@vonbrandことが必要だfindの終了ステータスをこれらの権限エラーが作るので、findゼロ以外のステータスで終了を
アーネストA

私はあなたの提案を得ることができません。予想される出力がいっぱいの場合、出力が得られません。unix.stackexchange.com/q/290791/16920ただし、そうでない場合は、あなたの方法が最善の方法だと思います。
レオレオポルトヘルツ준영

1
うわー、この答えを見つけるのがそんなに大変だったとは信じられません。今、私はそれをただ賛成する以上のことができることを望みます。
ウェッジ

8

locate(1)代わりに使用します:

$ locate netcdf

ユーザーに表示できるファイルのみが表示されます。


1
これは、それupdatedbが定期的に実行されていることを前提としています。それはすべてのLinuxシステムに当てはまるわけではありません。
アルセージュ

3
Locate(1)がインストールされている場合、そのデータベース定期的に更新される必要があります。そうでない場合は、locate(1)の障害ではなく、設定の誤りであると分類します。さらに、最後のDB更新以降に追加されたファイルを探しているまれなケースでは、手動で実行するのに数分しかかかりません。find(1)に対するlocate(1)の速度の利点から簡単に支払われるオーバーヘッドは、1年に6回ほど実行することになります。
ウォーレンヤング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.