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


794

許可を拒否されたメッセージをすべて非表示にする必要があります。

find . > files_and_folders

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

アクセス許可レベルをfiles_and_foldersファイルに送ることは可能ですか?

どうすれば同時にエラーを非表示にできますか?

回答:


259

注:
*この答えは、おそらくユースケースの保証よりも深くfind 2>/dev/null、多くの状況で十分な場合があります。それは、クロスプラットフォームの観点から、また、ガードされたケースが大部分は仮説であるとしても、可能な限り堅牢なソリューションを見つけるためのいくつかの高度なシェルテクニックの議論にとって興味深いかもしれません。
* ローカライズされたエラーメッセージを表示するようにシステムが構成されている場合は、find以下の呼び出しの前にLC_ALL=CLC_ALL=C find ...)を付けて、英語のメッセージが報告さgrep -v 'Permission denied'れるようにしてください。常に、しかし、すべてのエラーメッセージ表示されますが、その後にも英語になります。

あなたの場合はシェルがあるbashzsh、があります合理的にシンプルでありながら堅牢なソリューション使用して、唯一のPOSIX準拠のfind機能は、一方、bashPOSIXの一部ではない、それ自体、最も近代的なUnixプラットフォームでは、このソリューションが広くポータブル作り、それが付属しています:

find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)

注:コマンド全体が内部のコマンドの終了を待機しないため、完了後に一部grepのの出力が到着する可能性が少しあります。では、コマンドに追加することでこれを防ぐことができます。 find>(...)bash| cat

  • >(...)(まれに使用される)出力 プロセスの置換で、出力(この場合はstderr出力(2>)を内部のコマンドのstdinにリダイレクトできます>(...)。およびに
    加えて、原則としてそれらもサポートしていますがからのリダイレクトと組み合わせようとしていますここで行われているように()、stderrは黙って無視されているように見えます(内)。bashzshksh2> >(...)ksh 93u+

    • grep -v 'Permission denied'フィルタリングアウト-v)(からのすべての行findのフレーズが含まれているコマンドの標準エラー出力ストリーム)Permission deniedとstderrに残りの行を出力します(>&2)。

このアプローチは次のとおりです。

  • ロバストエラーメッセージにgrepのみ適用され(ファイルパスとエラーメッセージの組み合わせには適用されず、誤検出につながる可能性があります)、権限が拒否されたメッセージ以外のエラーメッセージはstderrに渡されます。

  • 副作用なしfindの終了コードは保持されます。検出されたファイルシステムアイテムの少なくとも1つにアクセスできないと、終了コードが生成されます1(ただし、アクセス許可が拒否されたエラー以外のエラーが発生したかどうかはわかりません)。


POSIX準拠のソリューション:

完全にPOSIX準拠のソリューションには制限があるか、追加の作業が必要です。

場合はfind出力がで捕獲されるのファイルとにかく(または完全に抑制さ)、そしてからのパイプラインベースのソリューションジョナサン・レフラーの答えは、単純で堅牢、およびPOSIX準拠であります:

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

リダイレクトの順序が重要であることに注意してください:最初に2>&1来る必要があります。

stdout出力をファイル内で事前にキャプチャすると、パイプラインを介してエラーメッセージのみ2>&1を送信でき、パイプラインは明確に操作できます。grep

唯一の欠点ことです全体の終了コードがなりますgrepコマンドのではなく、find存在しない場合:この場合の手段での、何の全部またはでエラーのみ許可拒否エラーは、終了コードがします1(シグナリング失敗を(そうでない場合、)許可が拒否されたエラー以外のエラー)0-これは意図とは逆です。
とは言っても、find存在しないパスを渡すなどの根本的な失敗を超えてほとんど情報を伝えないため、の終了コードが使用されることはほとんどありません
ただし、一部のみの特定のケース許可ないためにアクセスできない入力パスの数は、findの終了コード(GNUとBSDの両方find)に反映されます。処理されたファイルのいずれかで許可拒否エラーが発生した場合、終了コードはに設定され1ます。

以下のバリエーションは、それに対処します。

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

さて、終了コードは、すべてのエラーかどうかを示す以外に Permission denied発生しました:1そうならば、0そうでありません。
言い換えると、終了コードはコマンドの真の意図を反映する0ようになりました。エラーがまったく発生しないか権限拒否エラーのみが発生した場合、成功()が報告されます。
これはfind、上のソリューションのように、単に終了コードを渡すよりも間違いなく優れています。


gniourf_gniourfコメントには(まだPOSIX準拠)を提案する洗練されたリダイレクトを使用して、このソリューションの一般化さえにファイルパスを印刷するデフォルトの動作で動作する標準出力を

{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1

つまり、カスタムファイル記述子3を使用してstdout(1)とstderr(2)を一時的にスワップし、エラーメッセージだけgrepをstdout経由でパイプすることができます。

これらのリダイレクトすることなく、データ(ファイルパス)の両方エラーメッセージがにパイプされるgrepSTDOUTを介して、及びgrep次いで区別することができないエラーメッセージ Permission deniedと(仮想)名前が含まれてしまったファイルフレーズPermission denied

ただし、最初のソリューションと同様に、報告される終了コードはgrepのではなくfindであるが、上記と同じ修正を適用できる。


既存の回答に関するメモ:

  • 注意すべきいくつかのポイントがありますマイケルBruxの答えはfind . ! -readable -prune -o -print

    • GNU が必要findです。特に、macOSでは動作しません。もちろん、GNU findで動作するコマンドのみが必要な場合は、これは問題になりません。

    • 一部のPermission deniedエラーは依然として表面化する可能性があります。現在のユーザーが権限を持っているが(実行可能)権限を持たないディレクトリfind ! -readable -pruneアイテムについて、そのようなエラーを報告します。その理由は、ディレクトリ自体があるためということである読み、実行されていない、と下降を試みそのディレクトリは、エラーメッセージをトリガします。そうは言っても、典型的なケースは許可が欠落している場合です。rx-pruner

    • 注:次のポイントは哲学および/または特定の使用例の問題であり、特にパスを印刷するだけでよい場合は、それが自分に関係なく、コマンドがニーズによく合うと判断する場合があります。

      • 権限拒否エラーメッセージのフィルタリングを、任意のコマンドに適用できるようにする別のタスクとして概念化する場合、権限拒否エラーを予防的に防止する反対のアプローチでは、コマンドに「ノイズ」を導入する必要があります。複雑さと論理的な落とし穴 findfind
      • 例えば、ほとんどの方法を示すための試み(これを書いているように)マイケルの答えにコメントアップ投票延長を含めてコマンドを-name次のように、フィルタを:
        find . ! -readable -prune -o -name '*.txt'
        これは、しかし、しない末尾のため、意図したとおりに作業-printアクションがされる必要(説明はこの回答にあります)。このような微妙な問題により、バグが発生する可能性があります。
  • で最初のソリューションジョナサン・レフラーの答えはfind . 2>/dev/null > files_and_folders彼自身が述べて、 盲目的に沈黙すべてのエラーメッセージを(そして彼はまた説明しているようにこの問題を回避するには、十分に堅牢で面倒ではありません)。実用的に言えば、しかし、それが最も簡単な解決策は、任意およびすべてのエラーは許可関連のだろうと仮定するコンテンツかもしれとして、。

  • 霧の答えはsudo find . > files_and_folders簡潔かつ実用的ではなく、単に以外で無分別で印刷するファイル名をセキュリティ上の理由から、:あなたのように実行しているので、ルートユーザー、「あなたは、findのバグによって台無しにされているあなたの全体のシステムを持つリスクまたは悪意のあるバージョン、または予期せず何かを書き込む不正な呼び出し。これは通常の権限でこれを実行した場合には発生しませんでした

  • viraptorの回答の2番目の解決策は、find . 2>&1 | grep -v 'Permission denied' > some_file(パイプラインを介してstdoutとstderrの混合を送信するために)誤検知のリスクを実行し、場合によっては、stderrを介して許可拒否エラーを報告する代わりに、出力パスとともにそれらをキャプチャします出力ファイル内。


4
簡単な質問ですが、なぜ単なるパイプではなくプロセス置換を使用するのfind . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2ですか?
gniourf_gniourf 2016

2
@LéoLéopoldHertz준영:外部ファイルに出力したくない場合は、さらに配管を行ってください:{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
gniourf_gniourf

2
@LéoLéopoldHertz준영:POSIX準拠です。プロセス置換>(...)はBash固有です。
gniourf_gniourf 2016

2
の終了コードの保存をfind強調して宣伝する必要があるかどうかはわかりませんfind。の終了コードは悪用されていることで有名です。ここでは、それはゼロ以外になる可能性が非常に高くなります(そして無駄にそうなります)。
gniourf_gniourf 2016

3
POSIXは、execute/searchディレクトリを「検索」(含まれているファイルのiノードを取得)するために、ファイルモード権限を明示的に必要とします。find(ディレクトリ内readのファイルをリストする許可を要求することに加えて)サブディレクトリに降りるためにこれを行います。これは「バグ」や「移植エラー」ではありません。
wjordan 2016

542

使用する:

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シェル派生物(Bash、Kornなど)を備えたUnixのすべてのバリアント、およびのPOSIX準拠バージョンで動作しfindます。

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


9
あなたが私のような人なら、スペースの不足が重要であることに注意してください!2>/dev/null、スペースなし!
Nik 2013年

20
2>スペースなしで単一のユニットです。それとファイル名の間にスペースを入れることができます。2>&1(標準エラーを標準出力が送信されるのと同じ場所にリダイレクトする)など、他のリダイレクトと同様に、または2>&-標準エラーを閉じます。残りの詳細については、リダイレクトを参照してください。(上記のコードは、POSIXに似た一般的なシェルであり、に固有ではありませんbash。)
Jonathan Leffler '25年

3
端末が出力するのは大文字のPなので、大文字のPを使用する必要がありました。2>&1 | grep -v 'Permission denied'
David Doria

4
これはどのように受け入れられる解決策ですか?1)すべてのエラーをdev / nullにリダイレクトしています2)明示的なエラー文字列をフィルタリングしています!! これらに依存していることは有名ですが、もしあなたのファイルが 'permission denied'という名前のディレクトリにあったとしたらどうでしょう?おっとっと!
Gunchars 2014年

10
プログラムの出力を変更するためにエラー文字列をgreppingすることに反対しています。ほとんどの場合機能しますが、単純な解決策は適切ではありません(以下のpermsで検索してください)。理由を一例として挙げると、エラーは「Permission denied」であるため、OSXでは機能しません。エラー文字列にわずかな違いさえある他のシステムでも同じです(国際化は誰ですか?)
Gunchars '10 / 11/14

285

使用する:

find . ! -readable -prune -o -print

より一般的に

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

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

  • -readableテストは、読み込み可能なファイルにマッチします。!テストがfalseの場合、オペレータは、trueを返します。また! -readable、読み取り不可能なディレクトリ(&files)に一致します。
  • -pruneアクションはディレクトリに降りていません。
  • ! -readable -prune 翻訳可能:ディレクトリが読み取り可能でない場合は、そのディレクトリに移動しないでください。
  • -readableテストでは、アカウントのアクセス制御リストやその他の権限の工芸品にかかる-permテストは無視します。

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


6
違いはすでに述べられています。あなたが理解していない場合は、答えはおそらくあなたにとって何の違いもありませんか?STDOUTは同じです-STDERRは異なります(この回答で他のエラーメッセージが表示されます)-$?違います(他のエラーが発生しない場合、この回答で0は "成功"です-dev / nullにリダイレクトするときは常に> 0 "成功していません")-おそらく誰かが "正しい" $を必要としていますか?スクリプトで
Michael Brux 14

6
@Masiの最も明らかな欠陥はJonathanの回答です(grep -v)は 'Permission denied'を含むファイル名を除外します:)
Fruit

65
私はそれはあなたには、いくつかの他の検索条件を追加する必要がある場合、それはで行われるべきであることをここで追加するために、適切な感じ-ofind . ! -readable -prune -o -name '*.txt'
tempestadept

22
POSIXにfind-readableオプションが含まれていないことに注意してください。どちらも行わずfindBSDので、マックOS X用(私は他のシステムについてはよく分かりません)。したがって、GNUがfind保証されている場合、これはうまく機能しますが、システムにGNUがfindインストールされていることを保証できない場合、これをどのように適応するかは明らかではありません。(Linuxでは問題なく動作しますが、他の場所では動作する場合と動作しない場合があります。)
Jonathan Leffler、2015年

6
find . ! -readable -prune -o -name '*.txt'find 4.2.2を使用してUbuntu 14.04で動作しないようです。単調になりそう-nameです。いくつかの奇妙な理由で、私は成功しましたfind . \( ! -readable -prune \) -o -name '*.txt' -print
con-f-use

110

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

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

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

  1. sudoコマンドを使用できます。

    sudo find /. -name 'toBeSearched.file'

それはスーパーユーザーのパスワードを尋ねます、パスワードを入力するとき、あなたが本当に望む結果を見るでしょう。sudoコマンドを使用する権限がない場合、つまりスーパーユーザーのパスワードがない場合は、最初にシステム管理者に依頼してsudoersファイルに追加してもらいます。

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

    find /. -name 'toBeSearched.file' 2>/dev/null
  2. 標準エラー出力を(一般的に表示/画面)から標準出力(一般的に表示/画面)にリダイレクトしてから、grepコマンドで-v "invert"パラメーターを指定してパイプすると、「権限が拒否されました」という出力行が表示されなくなります。単語のペア:

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

7
@scottmrogowskiが質問に答えないことを除いて... 1. sudoersファイルに追加するようシステム管理者に依頼します。2.sudo find...
スティーブン

1
まさに私が探していたもの!
DankMasterDan

92

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

find / -name expect 2>/dev/null

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

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


3
@Masi、回答のコマンドはを使用しませんexpect。代わりに、expectこのコマンドが検索しようとするファイルの名前です。
Dhruv Kapoor 2014

2
1つのクラスのエラーメッセージを無視するためだけにすべてのstderr出力を盲目的にリダイレクトすることは、一般に悪い考えです。プロセスで他のすべての任意のエラーを失うことになります。
Josip Rodin

59

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

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


2
これはMac OSXでも問題なく動作します。またはfind . -name '...' -print 2>/dev/null
シャドーシープ

30

-permおよび-prune述語を使用して、読み取り不可能なディレクトリへの下降を回避することもできます(「許可が拒否された」印刷出力ステートメントをfindプログラムから削除するにはどうすればよいですか?-Unix&Linux Stack Exchangeも参照してください)。

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

4
-perm -g+r,u+r,o+r現在のユーザーがそのファイルを読み取ることができるかどうかに直接関係のない、ファイルのr 3つセキュリティプリンシパルすべてに(読み取り)アクセス許可が設定されているファイルと一致するだけです。現在のユーザー読み取ることのできるファイルを見逃す可能性と、読み取ることができないファイルと一致させる可能性の両方があります。
mklement0 2016年

find . -type d ! \( -perm -u+r -o -perm -g+r -o -perm -o+r \) -prune -o -printは良い解決策になると思います。
Mattia72

2
Mattia72 @:いいえ、完全にエミュレートすることは根本的に不可能である-readable-perm-私の以前のコメントを見ると、この例を考えてみます。echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=rプリントをfile、そのユーザーはビットがセットされている読んでいるので、それはに関しnobody、ユーザーではなく、現在のユーザー。現在のユーザーはこのファイルを読み取ることができません。試してみてくださいcat file。参照:私のこの答え
mklement0 2017年

23

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

find . 2>/dev/null >files_and_folders

20

上記のアプローチはMac OS Xのケースに対応していませんが、Mac OS X -readableはスイッチをサポートしていないため、これにより出力の「アクセス拒否」エラーを回避できます。これは誰かを助けるかもしれません。

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$

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


OS Xへの適切なバインディング!ジョナサンの答えは部分を説明し2>/dev/nullます。あなたは一部を説明していただけます-exec du -ch {} + 2>/dev/null | grep total$
レオ・レオポルド・ヘルツ준 영

1
@Masi -execオプション付きの任意のコマンドを使用して、コマンドによって検出されたファイルまたはディレクトリに対してさらにアクションを実行できますfinddu -ch file_pattern一致する各ファイルのサイズを計算し、file_patternその出力の最後の行は、に一致したすべてのファイルの総計ですfile_pattern。のマニュアルページを参照してくださいdugrep total総計を抽出する行をフィルタリングするだけです(これは最後の行です)。
Bunti 2016

13

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

find . 2>/dev/null > some_file

または、まずstderrとstdoutを結合してから、それらの特定のエラーをgrepします。

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

11

簡単な答え:

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異常な/破損したファイルでも「」を返す場合があります(たとえば、<v2.0.5 を使用してコンテナにマウントされたファイルシステムに影響するバグレポートを参照してくださいlxcfs

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

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

LC_ALL=CセットPOSIXロケール使用して環境変数を3>&2 2>&1 1>&3そして3>&2 2>&1 重複するファイル記述子パイプに標準エラーストリームへgrep、及び[ $? = 1 ]用途[]によって返されたエラーコードを反転させるgrepの元の挙動を近似するためにfind

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

ジョルディフェランの回答案についてどう思いますか?--あなたの答えをそれと比較できますか?
レオ・レオポルド・ヘルツ준 영

2
上記の回答のシェルスクリプトは汎用ではなく($ {m_find_name}に一致するディレクトリのみをリストします)、質問に関係のないいくつかのオプションが含まれています(nice、/ home *、-maxdepth 5、-follow)。この回答は、「読み取り可能で実行可能ではないディレクトリのフィルタリング」という特定の問題に、汎用性を保ちながらより簡潔に対処しています。
wjordan 2016

1
@wjordan:ありがとう。コメントを削除しましたが、1つの点が引き続き適用されます。- -permbasedソリューションは、引用が示唆するよりも根本的に意図したもの異なるため、提示する価値はありません。これは、ファイルの所有者に関する純粋にファイル中心のテストですグループ、どちらもコマンド(参照呼び出しユーザーとの任意の保証関係持ってこの答え鉱山のをそれは今あなたの改訂GNUソリューションのように見えないキャッチ許可が起因するエラーを否定した。ファイル
mklement0を

私はあなたが使用している構文(GNUとしてもBSDとしても)を認識していませんが、自己完結型の例:echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=rprints fileで私のポイントを説明します。これは、ユーザー読み取りビットが設定されているためですが、nobodyユーザーに関連しています、現在のユーザーではありません。現在のユーザーはこのファイルを読み取ることができません。試してみてくださいcat file
mklement0 2016

1
@ mklement0ディスカッションに感謝します。別のテストで記述した動作を生成することができました(最初に何が間違っていたのかわからない)-perm。ユーザーの現在のアクセス許可を決定するために機能しないようです。この回答からその代替案を削除しました。
wjordan 2016

4

許可が拒否されたという警告だけを回避するには、読み取りから読み取れないファイルを検索から除外して無視するようにfindに伝えます。ORとして式を検索に追加します。

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

これは主に(読み取り不可能なファイルを照合してリストから削除する)または * .jbdのような名前を照合し、[lsを使用して]表示する)ことを示しています。(デフォルトでは、-orを使用しない限り、式はANDで結合されることに注意してください。)2番目の式で-lsが必要です。 。

しかし、システムで実際のファイルを探している場合は、多くのファイルが含まれている/ devを探す必要はないので、次のように、そのディレクトリを除外する式を追加する必要があります。

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

したがって、(読み取り不可能なファイルに一致してリストから削除) OR (パス/ devに一致してリストから削除 OR * .jbdのようなファイルに一致して表示)


4

使用する

sudo find / -name file.txt

それは愚かで(検索を昇格させるため)、安全ではありませんが、書くのははるかに短いです。


ここでファイルシステム全体を検索するので、これは「検索の高度化」を意味します。なぜそれを非セキュアと呼ぶのですか?ファイルシステム全体を検索しているためですか?
レオ・レオポルド・ヘルツ준 영

2
sudoは、基本的に悪い考えであるroot権限でfindコマンドを実行するためです。分離と最小特権の原則に違反しています。
ミスト2014

3
ここでの「昇格」とは、を使用したrootへの特権sudoです。バグfindや悪意のあるバージョン、または予期しない何かを書き込む不正な呼び出しによってシステム全体がめちゃくちゃになるリスクがあります。これは、通常の権限でこれを実行した場合には起こり得ません。
Tripleee、2015

2

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

上記の答えマイケル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

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

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

nice find / home * / -maxdepth 5 -follow \
    \(- type d -a -type!\(-readable -a -executable \) \)-prune \
    -o \
    \(-type d -a -readable -a-実行可能ファイル-a -name "$ {m_find_name}" \)-print

ここで重要なのは、組み合わせ式の「真ではない」を配置することです。

has read access AND has execute access

それ以外の場合は、完全なアクセス権がありません。つまり、プルーニングします。これは、以前に提案されたソリューションが失敗した1つのシナリオで機能することが証明されました。

コメント欄に質問の技術的な詳細を以下に示します。詳細が多すぎる場合はお詫び申し上げます。

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

あなたの答えと素晴らしい観察をありがとう!私はあなたの答えをよりよくプレビューするためにここに賞金をオープンしました。読み取りと実行のアクセスを妨げない素晴らしい発見だと思います。- -あなたが使用する理由を説明していただけますnicefind $HOME -maxdepth 5 -follow ...
レオ・レオポルド・ヘルツ준 영

2
述べたようにシェルスクリプトは、汎用(のみのリストディレクトリのマッチングではありません${m_find_name})、そして、質問に関連していないいくつかのオプションが含まれています(nice/home*-maxdepth 5-follow)。汎用性を維持しながら、「読み取り可能で実行可能ではないディレクトリのフィルタリング」という特定の問題に対処する回答をより簡潔に追加しました。
wjordan 2016

2

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

-= MacOSの場合=-

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

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

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

$ file=<filename or mask>; search

例えば:

$ file = etc; 探す


1

CSHまたはTCSHを使用している場合、解決策は次のとおりです。

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

端末に出力したい場合:

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

ただし、「csh-whynot」FAQに記載されているように、CSHは使用しないでください。


すべてのtxtファイルをgrepして、隠しファイル/ディレクトリを除外し、「Permission denied」メッセージを出力しないようにします。私はcshシェルを使用しています。以下のコマンドを使用しましたが、機能しません。-type f -iname " .txt" -not -path '* / \。'| egrep -v "Permission denied" find。-type f -iname " .txt" -not -path '* / \。'2> / dev / null以下のエラー。find:パスは式の前に置く必要があります:2使用法:find [-H] [-L] [-P] [-Olevel] [-D help | tree | search | stat | rates | opt | exec] [path ...] [式]
yadav
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.