find コマンドを使用して、サブディレクトリを走査せずにディレクトリ内のワールド書き込み可能なファイルを一覧表示するにはどうすればよいでしょうか?

find コマンドを使用して、サブディレクトリを走査せずにディレクトリ内のワールド書き込み可能なファイルを一覧表示するにはどうすればよいでしょうか?

この問題の解決策は、何週間も見つかっていません。 を使用して、サブディレクトリを走査せずに、特定のディレクトリ セット内のワールド書き込み可能なファイルのみを検索するコマンドを作成しようとしています-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。)

関連情報