findと-prune、GNU、POSIXの解釈

findと-prune、GNU、POSIXの解釈

私のGNU findutils(FSF 2015)は次のように言います。

-prune
   True; 
   if the file is a directory, do not descend into it.
   If -depth is given, false; no effect.
   Because -delete implies -depth, you cannot usefully use -prune and -delete together.

そしてPosix:

-prune
    The primary shall always evaluate as true;
    it shall cause find not to descend the current pathname if it is a directory. 
    If the -depth primary is specified, the -prune primary shall have no effect.

改行文字のみ変更しました。注目すべき2つの点は次のとおりです。

-pruneこれは主演を完全に無視するのではないか?つまり、左側の式を「収集」し、残りは-o右側の式に残します。連結式ですか?

GNUのマニュアルページを見ると、少なくとも1つの例が表示されます。

-name pattern
    Base of ...
    ...
    ...   
    To ignore a directory and the files under it, use -prune;
    see an example in the description of -path.
    ...

さて、ここに簡単な例がありますfind . EXPR -prune -o -print。これは自然に質問を提起する。なぜfind .何も印刷するのですか?

振り返ってみると整理もうまくいっているのはすべてありました。

今関連の質問:

-pruneこれら2つの解釈(GNUとPOSIX)はどのような関係がありますか?

私の考えでは、posixは退屈な技術リストと有用なヒントを持っていて、何の理由もなく専門用語に変えたようです。これは誤解を招くかもしれません。

最終的に、両方の説明は次のような質問を残すからです。

Afterが常にtrueを返す場合、なぜ-oAfterが必要なのですか?-prune

以下はテストされた例です。スキップしたいマウントポイントがあり、ramdisk "0"(ゼロ)もスキップしたい "test"を含むすべてのファイルを一覧表示したいと思います。

find . -xdev -name "0" -prune -o -name '*test*'

このように動作し、./0実際に非常に興味深い行も含まれています。

prune-o-trickがない場合は明示的-print

ベストアンサー1

-pruneこれは主演を完全に無視するのではないか?つまり、左側の式を「収集」し、残りは-o右側の式に残します。連結式ですか?

いいえ、彼らはそれを無視しません。これはsの影響はまったくありませんが、s演算子の優先順位の結果であるためです-prunefind

find . EXPR -prune -o -print

等しい

find . \( EXPR -prune \) -o -print

-pruneEXPR本当かどうかを評価します。EXPRfalse の場合-pruneは評価されず、複合式は false と評価されます。EXPRtrue の場合は-prune常に true なので、複合式は true と評価されます。これらすべての結果は、何でも-print偽の場合にのみ評価されるということです。EXPR-prune

find . -xdev -name "0" -prune -o -name '*test*'

次の規則に従って、印刷と./0さまざまな一致が表示されます(マンページ引用)。*test*

完全な式に-pruneまたは他の操作が含まれていない場合、完全な式-print-printtrueのすべてのファイルが実行されます。

On では0true-name "0" -pruneと評価され、印刷されます。

この規則は、これらの動作が発生する理由も説明しますfind .

GNUとPOSIXの解釈は同じです。

  • "true; "match" 基本は常に true と評価する必要があります。
  • 「ファイルがディレクトリの場合はそのファイルに入らないでください。」は、「ディレクトリの場合、findは現在のパス名から降りないようになります」と一致します。
  • 「-deep を指定した場合、-prune は効果がありません。」は、「-length masternode が指定されている場合は、-prune masternode は効果がありません」と一致します。

(引用する改訂されたfind文書)。

-prune必ずしも従う必要はなく、-oこれを説明するいくつかの例があります。POSIX ドキュメントfind。このトリックは、find現在のディレクトリの即時コンテンツを制限するのに特に役立ちます。

find . ! -name . -prune -print

おすすめ記事