すべての パーミッション拒否 メッセージを次の場所から隠す必要があります。
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
には、特に、他のバージョンでは利用できない無数のオプションがあります。そのようなオプションセットについては、現在受け入れられている回答を参照してください。
つかいます:
find . ! -readable -Prune -o -print
もっと一般的に
find <paths> ! -readable -Prune -o <other conditions like -name> -print
で動作します:find(GNU findutils)4.4.2。バックグラウンド:
-readable
テストは読み取り可能なファイルと一致します。 testがfalseの場合、!
演算子はtrueを返します。そして! -readable
は読めないディレクトリ(&files)にマッチします。-Prune
アクションはディレクトリに降りません。! -readable -Prune
は、に翻訳することができます:ディレクトリが読めない場合は、それに降りてはいけません。-readable
テストでは、-perm
テストで無視されるアクセス制御リストとその他のアクセス許可の影響を考慮に入れています。詳細については find
(1)のマンページ も参照してください。
もしルート "/"から検索を始めたいのなら、おそらく次のような出力が表示されるでしょう。
find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied
許可のためです。これを解決するには
あなたはSudoコマンドSudo find /. -name 'toBeSearched.file'
を使うことができます。それはスーパーユーザーのパスワードを尋ねます、パスワードを入力するときあなたはあなたが本当に欲しいものの結果を見るでしょう。
標準エラー出力を(通常はDisplay/Screen)から何らかのファイルにリダイレクトして、画面にエラーメッセージが表示されないようにすることができます。特別なファイル/ dev/nullにリダイレクトします。
find /. -name 'toBeSearched.file' 2>/dev/null
標準エラー出力を(一般に表示/画面)から標準出力(一般に表示/画面)にリダイレクトしてから、 'Permission denied'を持つ出力行を表示しないように-v "invert"パラメータを指定してgrepコマンドを実行単語ペア
find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'
私は使用しなければなりませんでした:
find / -name expect 2>/dev/null
探したいものの名前を指定してから、すべてのエラーを/ dev/nullにリダイレクトするように指示します。
私が探していたexpectプログラムの場所であることを期待しています。
2>/dev/null を使用して、stderr
を/dev/null
にパイプ処理します。
find . -name '...' 2>/dev/null
-perm
述語と-Prune
述語を使って、読めないディレクトリに降りることを避けることもできます( findプログラムから "アクセス許可が拒否された" printout文を削除するにはどうすればいいですか? Unix&Linux Stack Exchange - /)。
find . -type d ! -perm -g+r,u+r,o+r -Prune -o -print > files_and_folders
標準エラーをリダイレクトします。たとえば、UNIXマシンでbashを使用している場合は、次のように標準エラーを/ dev/nullにリダイレクトできます。
find . 2>/dev/null >files_and_folders
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
に注意してください。
これらのエラーは標準エラー出力(fd 2)に出力されます。それらを除外するには、単にすべてのエラーを/ dev/nullにリダイレクトします。
find . 2>/dev/null > some_file
または、最初にstderrとstdoutを結合してから、次の具体的なエラーを解決します。
find . 2>&1 | grep -v 'Permission denied' > some_file
find . > files_and_folders 2>&-
2>&-
は、標準エラーファイル記述子(-
)を閉じる(2
)ため、すべてのエラーメッセージが無音になります。
1
」エラーが出力された場合、終了コードは引き続きPermission denied
になりますfind
の堅牢な回答:find . -type d \! \( -readable -executable \) -Prune -print -o -print > files_and_folders
追加オプションをfind
に渡します。これは -Prune
(下行を防ぎます)、それでも -print
任意のディレクトリ( -type
d
)( \!
)に -readable
と -executable
の両方の許可がない、または( -o
)-print
その他のファイル。
-readable
および -executable
オプションはGNU拡張であり、 POSIX標準の一部ではありませんPermission denied
」を返す場合があります(例: bug report を参照して、lxcfs
<v2.0.5を使用してコンテナーにマウントされたファイルシステムに影響を与えます)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
ファイル自体が書き込み可能でない場合)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 と表示) 。
つかいます
Sudo find / -name file.txt
それは(あなたが検索を高めるので)ばかげていて安全ではありませんが、書くのははるかに短いです。
上記の答えのどれも私のために働きませんでした。私がインターネット上で見つけるものは何でも焦点を合わせます:エラーを隠します。どれもプロセス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つのシナリオでは私のために働くことが証明されました。
私は以下の技術的な詳細をコメント欄に提供します。細部が過度であるならば、私は謝罪します。
- = MacOSの場合= -
Aliasを使用して新しいコマンドを作成します。〜/ .bash_profile行に追加するだけです。
alias search='find / -name $file 2>/dev/null'
そして新しいターミナルウィンドウでそれを呼び出すことができます:
$ file=<filename or mask>; search
例えば:
$ file = etc;サーチ
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
魔法にすべき
CSHまたはTCSHを使用している場合は、これが解決策です。
( find . > files_and_folders ) >& /dev/null
端末に出力したい場合は、
( find . > /dev/tty ) >& /dev/null