web-dev-qa-db-ja.com

「find」からすべての「許可拒否」メッセージを除外するにはどうすればよいですか。

すべての パーミッション拒否 メッセージを次の場所から隠す必要があります。

find . > files_and_folders

そのようなメッセージがいつ発生するかを実験しています。私はそれが起こらないすべてのフォルダとファイルを集める必要があります。

権限レベルをfiles_and_foldersファイルに送信することは可能ですか?

同時にエラーを非表示にする方法

つかいます:

find . 2>/dev/null > files_and_folders

これにより、もちろんPermission deniedエラーだけでなく、すべてのエラーメッセージも非表示になります。

許可されていないホップではなく、シンボリックリンクのホップ数が多すぎるなど、他のエラーの可能性を本当に保持したい場合は、「許可が拒否されました」と呼ばれる多くのファイルがないと推測する必要がありますそして試してください:

find . 2>&1 | grep -v 'Permission denied' > files_and_folders

標準エラーのみを厳密にフィルタリングする場合は、より複雑な構成を使用できます。

find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2

findコマンドのI/Oリダイレクトは、2>&1 > files_and_folders |です。パイプは、標準出力をgrepコマンドにリダイレクトし、最初に適用されます。 2>&1は、標準出力(パイプ)と同じ場所に標準エラーを送信します。 > files_and_foldersは、標準出力(標準エラーではない)をファイルに送信します。最終的な結果は、標準エラーに書き込まれたメッセージがパイプを介して送信され、findの通常の出力がファイルに書き込まれることです。 grepは標準出力をフィルタリングし(どの程度選択するかを決定でき、ロケールとO/Sに応じてスペルを変更する必要がある場合があります)、最後の>&2は生き残ったエラーメッセージ(標準出力)もう一度標準エラーに移動します。最終的なリダイレクトは、端末ではオプションと見なすことができますが、スクリプトで使用して、エラーメッセージが標準エラーに表示されるようにすることをお勧めします。

何をしたいかによって、このテーマには無限のバリエーションがあります。これは、Bourne Shell派生(Bash、Korn、…)およびPOSIX準拠バージョンの find を持つUnixのすべてのバリアントで動作します。

システムにあるfindの特定のバージョンに適応したい場合は、代替オプションが利用できる場合があります。 GNU findには、特に、他のバージョンでは利用できない無数のオプションがあります。そのようなオプションセットについては、現在受け入れられている回答を参照してください。

531

つかいます:

find . ! -readable -Prune -o -print

もっと一般的に

find <paths> ! -readable -Prune -o <other conditions like -name> -print
  • 「許可が拒否されました」を避けるため
  • AND(その他の)エラーメッセージを抑制しません
  • 終了ステータス0( "すべてのファイルは正常に処理されました")を取得する

で動作します:find(GNU findutils)4.4.2。バックグラウンド:

  • -readableテストは読み取り可能なファイルと一致します。 testがfalseの場合、!演算子はtrueを返します。そして! -readableは読めないディレクトリ(&files)にマッチします。
  • -Pruneアクションはディレクトリに降りません。
  • ! -readable -Pruneは、に翻訳することができます:ディレクトリが読めない場合は、それに降りてはいけません。
  • -readableテストでは、-permテストで無視されるアクセス制御リストとその他のアクセス許可の影響を考慮に入れています。

詳細については find(1)のマンページ も参照してください。

268
Michael Brux

もしルート "/"から検索を始めたいのなら、おそらく次のような出力が表示されるでしょう。

find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied

許可のためです。これを解決するには

  1. あなたはSudoコマンドSudo find /. -name 'toBeSearched.file'を使うことができます。それはスーパーユーザーのパスワードを尋ねます、パスワードを入力するときあなたはあなたが本当に欲しいものの結果を見るでしょう。

  2. 標準エラー出力を(通常はDisplay/Screen)から何らかのファイルにリダイレクトして、画面にエラーメッセージが表示されないようにすることができます。特別なファイル/ dev/nullにリダイレクトします。

    find /. -name 'toBeSearched.file' 2>/dev/null
    
  3. 標準エラー出力を(一般に表示/画面)から標準出力(一般に表示/画面)にリダイレクトしてから、 'Permission denied'を持つ出力行を表示しないように-v "invert"パラメータを指定してgrepコマンドを実行単語ペア

    find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'
    
107
Fatih Aksu

私は使用しなければなりませんでした:

find / -name expect 2>/dev/null

探したいものの名前を指定してから、すべてのエラーを/ dev/nullにリダイレクトするように指示します。

私が探していたexpectプログラムの場所であることを期待しています。

87
Jeremy

2>/dev/null を使用して、stderr/dev/nullにパイプ処理します。

find . -name '...' 2>/dev/null

54
Matt

-perm述語と-Prune述語を使って、読めないディレクトリに降りることを避けることもできます( findプログラムから "アクセス許可が拒否された" printout文を削除するにはどうすればいいですか? Unix&Linux Stack Exchange - /)。

find . -type d ! -perm -g+r,u+r,o+r -Prune -o -print > files_and_folders
29
sdaau

標準エラーをリダイレクトします。たとえば、UNIXマシンでbashを使用している場合は、次のように標準エラーを/ dev/nullにリダイレクトできます。

find . 2>/dev/null >files_and_folders
23
Jason Coco

Mac OS Xでは-readableスイッチがサポートされていないため、上記の方法ではMac OS Xのケースに対処できませんが、これにより、出力での "Permission denied"エラーを回避できます。これは誰かに役立つかもしれません。

find / -type f -name "your_pattern" 2>/dev/null

たとえば、findと一緒に他のコマンドを使用してディレクトリ内の特定のパターンのファイルのサイズを調べる場合、2>/dev/nullは以下のように機能します。

find . -type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$

これは与えられたパターンのファイルの合計サイズを返します。 findコマンドの最後にある2>/dev/nullに注意してください。

19
Bunti

これらのエラーは標準エラー出力(fd 2)に出力されます。それらを除外するには、単にすべてのエラーを/ dev/nullにリダイレクトします。

find . 2>/dev/null > some_file

または、最初にstderrとstdoutを結合してから、次の具体的なエラーを解決します。

find . 2>&1 | grep -v 'Permission denied' > some_file
13
viraptor

簡単な答え:

find . > files_and_folders 2>&-

2>&- は、標準エラーファイル記述子(-)を閉じる(2)ため、すべてのエラーメッセージが無音になります。

  • 1」エラーが出力された場合、終了コードは引き続きPermission deniedになります

GNU findの堅牢な回答:

find . -type d \! \( -readable -executable \) -Prune -print -o -print > files_and_folders

追加オプションをfindに渡します。これは -Prune (下行を防ぎます)、それでも -print 任意のディレクトリ( -typed)( \! )に -readable-executable の両方の許可がない、または( -o-printその他のファイル。

  • -readable および -executable オプションはGNU拡張であり、 POSIX標準の一部ではありません
  • 異常なファイルや破損したファイルに対して「Permission denied」を返す場合があります(例: bug report を参照して、lxcfs <v2.0.5を使用してコンテナーにマウントされたファイルシステムに影響を与えます)

POSIX互換のfind(GNU、OSX/BSDなど)で機能する堅牢な回答

{ LC_ALL=C find . 3>&2 2>&1 1>&3 > files_and_folders | grep -v 'Permission denied'; [ $? = 1 ]; } 3>&2 2>&1

pipeline を使用して、標準エラーストリームを grep に渡し、'Permission denied'文字列を含むすべての行を削除します。

LC_ALL=Cは、 環境変数3>&2 2>&1 1>&3および3>&2 2>&1を使用して POSIXロケール を設定します duplicate file descriptors 標準エラーストリームをgrepにパイプし、[ $? = 1 ]を使用して [] を使用して、grepによって返されるエラーコードを反転し、findの元の動作を近似します。

  • 出力のリダイレクトに起因する'Permission denied'エラーもフィルタリングします(たとえば、files_and_foldersファイル自体が書き込み可能でない場合)
10
wjordan

just パーミッションが警告を否定するのを避けるために、検索からそれらを剪定することによって読めないファイルを無視するようにfindに伝えてください。次のように、検索結果にORとして式を追加します。

find / \! -readable -Prune -o -name '*.jbd' -ls

これは主に (読めないファイルに一致させ、それをリストから削除する) OR* .jbd のような名前に一致させ、それを[ls]で表示します) 。 2番目の式に-lsが必要です。そうしないと、いずれかの一致を表示するためのデフォルトのアクションが追加されます。これにより、読めないファイルもすべて表示されます。 。

しかし、システム上で実際のファイルを探しているのであれば、多くのファイルがある/ devを探す理由は通常ないので、そのディレクトリを除外する式を追加する必要があります。

find / -mount \! -readable -Prune  -o  -path /dev -Prune  -o  -name '*.jbd' -ls

だから (リストからの読み込み不可能なファイルとPruneのマッチング) OR (リストからのマッチングパス/ devとPrune) OR (ファイルのマッチング / * .jbd と表示)

4
simpleuser

つかいます

Sudo find / -name file.txt

それは(あなたが検索を高めるので)ばかげていて安全ではありませんが、書くのははるかに短いです。

4
mist

上記の答えのどれも私のために働きませんでした。私がインターネット上で見つけるものは何でも焦点を合わせます:エラーを隠します。どれもプロセスreturn-code/exit-codeを適切に処理しません。私はbashスクリプト内でコマンドfindを使用していくつかのディレクトリを見つけてその内容を調べます。私はexit-codeを使用してcommand find successを評価します。値ゼロは機能し、そうでなければ失敗します。

上記の 答えは by Michael Brux で動作します。しかし、失敗するシナリオが1つあります。私はその問題を発見しそれを自分で直した。次の場合にファイルを整理する必要があります。

it is a directory AND has no read access AND/OR has no execute access

ここで重要な問題を参照してください:AND/OR。私が読んだ1つの良い提案された条件シーケンスは次のとおりです。

-type d ! -readable ! -executable -Prune

これは常にうまくいくとは限りません。これは、一致が次の場合にプルーンがトリガーされることを意味します。

it is directory AND no read access AND no execute access

読み取りアクセスは許可されているが実行アクセスが許可されていない場合、この一連の式は失敗します。

いくつかのテストの後、私はそれを理解し、私のシェルスクリプトソリューションを次のように変更しました。

素敵な検索/ home */-maxdepth 5 -follow \
\(-type d -a ! \(-readable -a -executable \) \) -プルーン \
-o \
\(-type d -a -readable -a -executable -a -name "$ {m_find_name}" \)-print

ここで重要なのは、結合式に「正しくない」ことを示すことです。

has read access AND has execute access

それ以外の場合は、フルアクセス権がありません。つまり、整理します。これは、以前に提案された解決策が失敗した1つのシナリオでは私のために働くことが証明されました。

私は以下の技術的な詳細をコメント欄に提供します。細部が過度であるならば、私は謝罪します。

  • なぜコマンドniceを使用するのですか。私は ここで という考えを得ました。最初はファイルシステム全体を見るときにプロセスの優先順位を下げるのがいいと思いました。私のスクリプトは少数のディレクトリに限られているので、私には意味がないことに気づきました。 -maxdepthを3に減らしました。
  • / home * /で検索するのはなぜですか。これはこのスレッドには関係ありません。私はすべてのアプリケーションをソースコードを介して手動でインストールします(rootではなく)非特権ユーザーでコンパイルします。それらは "/ home"内にインストールされています。私は複数のバイナリとバージョンを共存させることができます。私はすべてのディレクトリを探し出し、マスター - スレーブ方式で調べてバックアップする必要があります。複数の "/ home"(専用サーバー内で実行されている複数のディスク)を持つことができます。
  • なぜ-followを使うのですか?ユーザーはディレクトリへのシンボリックリンクを作成することがあります。それは有用性によりますが、見つけた絶対パスを記録する必要があります。
2
Jordi Ferran

- = MacOSの場合= -

Aliasを使用して新しいコマンドを作成します。〜/ .bash_profile行に追加するだけです。

alias search='find / -name $file 2>/dev/null'

そして新しいターミナルウィンドウでそれを呼び出すことができます:

$ file=<filename or mask>; search

例えば:

$ file = etc;サーチ

2
Jan aka uptech

Grep -v invert-matchを使用できます。

-v, --invert-match        select non-matching lines

このような:

find . > files_and_folders
cat files_and_folders | grep -v "permission denied" > files_and_folders

魔法にすべき

2

CSHまたはTCSHを使用している場合は、これが解決策です。

( find . > files_and_folders ) >& /dev/null

端末に出力したい場合は、

( find . > /dev/tty ) >& /dev/null

ただし、 "csh-whynot" FAQで説明されているように、CSHは使用しないでください。

0
Kayle Sawyer