検索:クリーンアップは指定されたパスを無視しません。

検索:クリーンアップは指定されたパスを無視しません。

.git検索から除外する必要がありますfind。これを達成するためにスイッチを使用しました-path ./.git -prune

$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git

ただし、これは.gitディレクトリの内容をスキップしてもディレクトリ自体を一覧表示します。追加すると動作します-path ./.git -prune -o -print -a

find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'

これがなぜ必要ですか?どちらのコマンドも同じ出力を持つべきだと思います。 2番目の構文は非常に見苦しいです。

ベストアンサー1

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を除くすべてのディレクトリを見つけたら、現在のディレクトリを取得します。.そして./bbそれも言葉になります。

$ find . -type d ! -name aa
.
./bb

これまでは大丈夫でしたが、-prunefindを使用するとクリーンアップ中のディレクトリが返されます。最初は、整理中のディレクトリ以外のすべてのディレクトリを返すことを期待していたので、混乱しました。

$ find . -type d -name aa -prune
./aa

-pruneマニュアルページのセクションで指定するのではなく、クリーンアップされたディレクトリを返す理由を説明しました。ティモの答えしかし、このEXPRESSIONSセクションでは次のようになります。

式に以外の操作が含まれていない場合、-prune式  -printがtrueのすべてのファイルが実行されます。

これは、式がディレクトリ名と一致するため、 find が暗黙的にコマンド全体の最後に a を追加するaaため、式が true と評価され印刷されることを意味します。ただし、意図的にタスクを最後に直接追加すると、次のものは追加されません。-print-print-o -print

find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3

ここで、 find コマンドは暗黙のエントリを追加しないため、-printpruning() 中のディレクトリはaa印刷されません。

file*したがって、最後にファイル名パターンを含むファイルを検索する句を追加する場合は、次のように2番目の句の最後に句を追加する必要があります-o-print

find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3

-print同じように動作します。 2 番目の句に a を入れないと、find はコマンドの最後に a を自動的に追加します。なぜなら、-pruneそれ以外は何もしないからです。セクションでクリーンアップされたディレクトリを印刷します。-print-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このコマンドの世界的な混乱を避けるために、マニュアルページを更新する必要があります。

おすすめ記事