
この問題の解決策は、何週間も見つかっていません。 を使用して、サブディレクトリを走査せずに、特定のディレクトリ セット内のワールド書き込み可能なファイルのみを検索するコマンドを作成しようとしています-prune
。
私はさまざまな選択肢を試しましたが、結局
find / -type f -perm -2
しかし、これはサブディレクトリを横断します。次のコマンドを使用して
find / -prune -type f -perm -2
結果も得られません。どこが間違っているのでしょうか?
答え1
代わりに以下を使用してみてくださいmaxdepth N
:
-最大深度レベル
開始点より最大で levels (負でない整数) レベルのディレクトリまで降りていきます。-maxdepth 0 は、開始点自体にのみテストとアクションを適用することを意味します。
find $FOLDER -maxdepth 1 -perm -2
答え2
find / -type f -perm -2
これは再帰的です。それが何をfind
意味するのか。
find / -prune -type f -perm -2
find
ここでは、見つかったものすべてに適用するように指示しています-prune
。条件とアクションは左から右に処理されます。 の前に条件がないため-prune
、無条件に適用されます。したがって、 が最初にfind
見つけたもの、つまりコマンドライン引数/
が-prune
適用されているため、find
ディレクトリの内容を走査しません。 は/
後続の条件に一致しないため、印刷されません。
トップレベルディレクトリのエントリのみを処理するには、-prune
ディレクトリに適用する必要があります。コマンドライン引数を除くこれを行うポータブルな方法は、/.
コマンドラインで渡されるパスの末尾で を使用することです。これにより、 はfind
それらの名前を として扱う.
ため、 を使用して-name .
それらを一致させることができます。再帰的なトラバーサルでは、この名前は予約されているため、ファイルは呼び出されません.
。現在、3 つの異なるケースがあります。
- 最上位ディレクトリ: recurse。
- その他のディレクトリ: 再帰しないでください。
- 誰でも書き込み可能な通常のファイル: print。
複数の異なる動作を指定するには、-o
「または」演算子を使用します。すべての条件が一致する最初の動作が適用されます。
find /. -name . -o -type d -prune -o -type f -perm -2 -print
のいくつかのバージョンではfind
書き込みが可能ですfind / -name / -o -type d -prune -o …
が、一部では書き込みができません (例: BusyBox)。
のいくつかのバージョンは、再帰的なトラバーサルを制限するfind
オプション-mindepth
とをサポートしています。 find がこれをサポートしている場合は、 の代わりにこれを使用できます。-maxdepth
-prune
find / -mindepth 1 -maxdepth 1 -type f -perm -2
(-mindepth
と は-maxdepth
グローバル オプションなので、条件とアクションの部分に-type f -perm -2
暗黙的に末尾の が付きます-print
。)