bash - 表示 - 「許可が拒否された」すべてのメッセージを「検索」から除外するにはどうすればよいですか?




シェル スクリプト 検索 (12)

簡単な答え:

find . > files_and_folders 2>&-

2>&-すべてのエラーメッセージが消されるように、標準エラーファイル記述子( 2 )を閉じます( - )。

  • Permission denied 」というエラーが他の方法で出力された場合、終了コードは1なります

GNU find強力な答え:

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

-prunefind余分なオプションを渡しますが、降順ではありませんが、 -readable -executable権限を持っていないディレクトリ( -readable \! d )や、他のファイルを( -o ) 。

  • -readableおよび-executable可能なオプションは、 find一部ではなく、GNU拡張です
  • 異常/壊れたファイルに対して ' Permission denied 'が返されることがあります( 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は、標準エラーストリームをgrepにパイプするために、 環境変数3>&2 2>&1 1>&3および3>&2 2>&1 2>&-を使用してPOSIXロケールを設定します [ $? = 1 ] [ $? = 1 ][]を使ってgrepが返すエラーコードを反転させ、 find元の動作を近似しfind

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

私はすべての許可を拒否されたメッセージを隠す必要があります:

find . > files_and_folders

私はそのようなメッセージが発生したときに実験しています。 私は、それが発生しないすべてのフォルダとファイルを収集する必要があります。

許可レベルをfiles_and_foldersファイルにfiles_and_foldersことはfiles_and_foldersですか?

どのようにしてエラーを同時に隠すことができますか?


- = MacOSの場合= -

エイリアスを使って新しいコマンドを作る:〜/ .bash_profile行を追加するだけ。

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

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

$ file=<filename or mask>; search

例えば:

$ file = etc; サーチ



2> / dev / nullを使用してstderr/dev/nullパイプします

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


あなたは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

魔法にすべき


これらのエラーは、標準エラー出力(fd 2)に出力されます。 それらをフィルタリングするには、すべてのエラーを/ dev / nullにリダイレクトしてください:

find . 2>/dev/null > some_file

またはstderrとstdoutに最初に参加し、次に特定のエラーをgrepします。

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

つかいます:

find . ! -readable -prune -o -print

より一般的には

find <paths> ! -readable -prune -o <other conditions like -name> -print
  • 「Permission denied」を避けるために
  • そして(他の)エラーメッセージを抑制しないでください
  • 終了ステータス0を取得する(「すべてのファイルが正常に処理された」)

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

  • 読み取り可能なテストは、読み取り可能なファイルと一致します。 ! 演算子は、testがfalseの場合にtrueを返します。 そして! -readable ! -readableは読み込み可能なディレクトリ(&ファイル)と一致しません。
  • -pruneアクションは、ディレクトリには移動しません。
  • ! -readable -prune ! -readable -pruneは次のように変換することができます:もしディレクトリが読み込み不可能なら、それに下降しないでください。
  • -readableテストでは、アクセス制御リストと、 -permテストで無視されるその他の権限アーチファクトが考慮されます。

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


つかいます:

find . 2>/dev/null > files_and_folders

これはもちろん、 Permission deniedエラーを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シェルの派生物(Bash、Korn、...)とPOSIX準拠バージョンのfind Unixの変種で動作しfind

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


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

find . 2>/dev/null >files_and_folders

ルート "/"から検索を開始する場合は、次のような出力が表示されます。

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

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

  1. あなたはsudoコマンドを使うことができます: sudo find /. -name 'toBeSearched.file' sudo find /. -name 'toBeSearched.file'ます。 それはスーパーユーザーのパスワードを尋ねます、あなたが本当に望む結果が表示されますパスワードを入力するとき。

  2. 標準エラー出力を(一般的にはディスプレイ/スクリーン)から一部のファイルにリダイレクトし、エラーメッセージが画面に表示されないようにすることができます! 特別なファイル/ dev / nullにリダイレクトする:

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

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

上記の答えのどれも私のために働かなかった。 私がインターネット上で見つけたものは、エラーを隠すことに焦点を当てています。 プロセスの戻りコード/終了コードを正しく処理するものはありません。 私はbashスクリプト内のコマンドfindを使用していくつかのディレクトリを探し、その内容を調べます。 exit-codeを使用してコマンドの成功を評価します。値ゼロが機能します。それ以外の場合は失敗します。

が上で示し答えはときどき働く。 しかし、私はそれが失敗する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

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

いくつかのテストの後、私はそのことを認識し、シェルスクリプトソリューションを以下のように変更しました:

nice find / home * / -maxdepth 5 -follow \
\( -type d -a !\(-readable -a -executable \) \)-prune \
-o \
\(-type d -a -readable -a -executable -a -name "$ {m_find_name}" \)-print

ここで重要な点は、結合された式に「真ではない」と置くことです。

has read access AND has execute access

それ以外の場合はフルアクセス権がありません。つまり、プルーニングします。 これは以前の提案されたソリューションが失敗した1つのシナリオで私のために働くことが判明しました。

私は以下のコメントセクションに質問に関する技術的な詳細を提供します。 細かいことがあれば謝ります。

  • ¿コマンドを使いこなすのはなぜですか? 私はhereその考えを得た。 最初は、ファイルシステム全体を調べるときにプロセスの優先度を下げるのがいいと思っていました。 私のスクリプトはいくつかのディレクトリに限られているので、私には分かりません。 私は-maxdepthを3に減らしました。
  • ¿なぜ/ home * /内で検索するのですか? これはこのスレッドには関係ありません。 私はroot以外の権限を持たないユーザと一緒にコンパイルするためにソースコードを使って手作業ですべてのアプリケーションをインストールします。 それらは "/ home"内にインストールされます。 私は一緒に暮らす複数のバイナリとバージョンを持つことができます。 私はすべてのディレクトリを探し、マスターとスレーブの方法でバックアップを検査する必要があります。 複数の「/ home」(専用サーバー内で複数のディスクが稼動している)を持つことができます。
  • ¿-followを使う理由? ユーザーはディレクトリへのシンボリックリンクを作成する可能性があります。 有用性にもよりますが、絶対パスを記録しておく必要があります。

検索結果をファイルに保存する簡単なソリューションもあります。

見つける。 -name 'NameOfSearchedFile' >> results.txt





file-permissions