.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
これまでは大丈夫でしたが、-prune
findを使用するとクリーンアップ中のディレクトリが返されます。最初は、整理中のディレクトリ以外のすべてのディレクトリを返すことを期待していたので、混乱しました。
$ find . -type d -name aa -prune
./aa
-prune
マニュアルページのセクションで指定するのではなく、クリーンアップされたディレクトリを返す理由を説明しました。ティモの答えしかし、このEXPRESSIONS
セクションでは次のようになります。
式に以外の操作が含まれていない場合、
-prune
式
これは、式がディレクトリ名と一致するため、 find が暗黙的にコマンド全体の最後に a を追加するaa
ため、式が true と評価され印刷されることを意味します。ただし、意図的にタスクを最後に直接追加すると、次のものは追加されません。-print
-print
-o -print
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
ここで、 find コマンドは暗黙のエントリを追加しないため、-print
pruning() 中のディレクトリは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
このコマンドの世界的な混乱を避けるために、マニュアルページを更新する必要があります。