剪定されたディレクトリがfind
コマンドによって出力される理由と、その他の複雑な機能の詳細についても混乱しまし-prune
たが、いくつかの例でそれを理解することができました。
以下の例を実行するには、次のディレクトリとファイルを作成します。
mkdir aa
mkdir bb
touch file1
touch aa/file1
touch bb/file3
この構造を作成するには:
$ tree
.
├── aa
│ └── file1
├── bb
│ └── file3
└── file1
次に、findを使用してという名前のディレクトリを探しますaa
。ここで問題ありません。
$ find . -type d -name aa
./aa
aa以外のすべてのディレクトリを検索すると、現在のディレクトリ.
andが取得され./bb
ます。これも意味があります。
$ find . -type d ! -name aa
.
./bb
これまでのところ良好ですが、を使用すると-prune
、findはプルーニングしているディレクトリを返します。
$ find . -type d -name aa -prune
./aa
それはプルーニングされているディレクトリを返す理由はないで、説明-prune
で示したように、manページのセクションティモの答えが、中にEXPRESSIONS
セクション:
式は以外のアクションが含まれていない場合は-prune
、
-print
式が真であるすべてのファイルに対して実行されます。
つまり、式はaa
ディレクトリ名と一致するため、式はtrueと評価され、find -print
がコマンド全体の末尾に暗黙的にa を追加するため、出力されます。-print
ただし、意図的に-o -print
最後にアクションを追加した場合、は追加されません。
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
ここで、findコマンドは暗黙を追加し-print
ないため、プルーニングするディレクトリ(aa
)は出力されません。
最後に、ファイル名パターンがのfile*
後にあるファイルを検索する句を追加する場合は、次のように2番目の句の最後に-o
aを配置する必要があります-print
。
find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3
これが機能する理由は同じです-print
。2番目の句にaを指定しない場合、-prune
アクション以外のアクションがないため、findは-print
コマンドのTHE ENDに自動的に追加し、-prune
句にプルーニングされたディレクトリ:
find . \( \( -type d -name aa -prune \) -o \( -type f -name 'file*' \) \) -print
./aa
./file1
./bb/file3
通常、-print
コマンドは2番目の句に配置する必要があります。元のポスターのように中央に配置すると、プルーニングされているファイルがすぐに印刷され、2番目の句が必要なファイルを選択する機会がないため、正しく機能しません。
find . \( -type d -name aa -prune -o -print \) -o \( -type f -name 'file*' \)
.
./file1
./bb
./bb/file3
そのため、残念ながら、元のポスターは上記のコマンドを間違っ-print
た場所に配置することで間違っていました。それは彼の特定のケースではうまくいったかもしれませんが、一般的なケースではうまくいきません。
どのように-prune
機能するかを理解するのに苦労している何千人もの人々がいます。find
manページには、このコマンドについてネバーエンディング世界的な混乱を防ぐために更新する必要があります。
-print
そうでない場合、暗黙的には、-print
全体の条件に適用される