特定のディレクトリを除外できませんでした。

特定のディレクトリを除外できませんでした。

.git/コマンドのみを使用して、findディレクトリ内のファイルを除くすべてのファイルを一覧表示したいと思います。

私はこれを試しました:

$ find . -path .git -prune -type f
$

(私が持っている2つではなく)0個のファイルを返したので、次のことを試しました。

$  find . -not -path .git -type f | grep -c '\.git'
1770
$

なぜこれが効果がないのか理解できません。助けてもらえますか?

EDIT0:@icarusのおかげで、パスが前に来なければならないことがわかり、そのため演算子が./ありません。このコマンドは機能しました。OR

$ find . -path ./.git -prune -o -type f | grep '\.git'
./.git
./.gitignore
$

EDIT1:他のコマンドが機能しないのはなぜですか?

$ find . -not -path ./.git -a -type f | grep -c '\.git'
1770
$

EDIT2:最後の質問:-prune述部が-o -print次のコマンドの結果を印刷する必要がないのはなぜですか./.git./.gitignore

$ find . -name ".git*" -prune | grep git
./.git
./.gitignore
$ find . -name ".git*" -prune -o -print | grep -c git
0

編集3:ありがとう@rastafile:

$ find . -name ".git*" -prune | grep git
./.git
./.gitignore
$ find . -name ".git*" -prune -print | grep git
./.git
./.gitignore
$ find . -name ".git*" -prune -o -print | grep git
$

GNU find述語は、前の式がtrueのときに-prune暗黙的に呼び出されるように見えます。-print

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

結論:私に必要なコマンドは次のとおりです。

$ find . -name ".git*" -prune -o -type f -print

みんなありがとうございます。

ベストアンサー1

-pathとの間には大きな違いがあります-name。どちらもまったく似ていません。 「名前」は最後の部分だけを見て、「パス」は全体のスラッシュチェーンを見ます。 「ファイル名」または「パス名」の意味は常に議論の余地があります。しかし、ここでのポイントは明確で重要です。

これはうまくいきます(あなたが言ったように):

find . -path ./.git -prune -o -type f 

で始まる.と、デフォルトのgitdirが見つかり、クリーンアップされます。他のファイルは存在しないので、./.git他のすべての人の()タイプファイルをチェックします。-o


最後の例:

find . -not -path ./.git -a -type f 

動作しません。ちょうどすべてを見つける。文書

避けたいならマッチしなけれ-pruneばならない内部項目:

-path './.git/*'

Icarusの-name / -pruneの組み合わせに同意しますが、修正があります。

]# find . -name .git -prune -o -type f -name '*git*' -print   
./.git.filehidd
./gitfile

ここでは括弧は必要ありません。

-name '*git*'テスト/出力を減らすために追加されました。

-print最後の明示的な操作は、以下をトリミングして印刷を抑制します。

]# find . -name .git -prune                                 
./.git
./10/.git

かっこについてよくわかりません。man find(GNU)を探すと、これについての素晴らしい詳細が表示されます。

 find . -name .snapshot -prune -o \( \! -name *~ -print0 \)

.... しかし、.snapshot という名前のファイルとディレクトリ (およびその中のすべての内容) は省略します。また、名前が ~ で終わるファイルやディレクトリは省略しますが、内容は省略します。 この構造は-prune -o \( ... -print0 \) 非常に一般的です。 ここでのアイデアは、-pruneの前の表現が整理する内容と一致することです。ただし、-prune操作自体はtrueを返すため、次の-oはクリーンアップされていないディレクトリに対してのみ右側が評価されることを保証します。クリーンアップされたディレクトリの内容はアクセスさえないため、その内容は関係ありません。 -o の右式は次のとおりです。括弧は単に明確さのためのものです。。 -print0 操作は、-prune が適用されていないコンテンツでのみ機能することを強調します。テスト間の基本的な「and」条件付きバインディングのため-oより近い、これはとにかくデフォルトですが、角かっこは何が起こっているのかを示すのに役立ちます。

私にとっては、次の方法で明確性が向上しました。

find . ( -name .snapshot -prune ) -o ( ! -name '*~' -print0 )

しかし、これはうまくいきません!

ここで-aこのようなものを省略すると、-o明確にするために括弧も省略できるほど目立つ。


(シェルもかっこが好きなので、あなたはそれを引用する必要があります。しかし今、明確さはこんにちはです。 )

1) find . -name .snapshot -prune -o \( \! -name *~ -print0 \)

2) find . -name .snapshot -prune -o ! -name '*~' -print0 

引用されていないのはうまくいきます!が(私はそうです)、引用されていないものはうまくいきませ*ん。


したがって、ディレクトリ以外のファイル(すべての種類)を見つけるには、次の手順を実行します.git

find -name '.git' -type d -prune -o -print 

(気にしない場合は、type-dも省略できます... Camille'sを参照してください。コメント...外はジャングルです。そこ、小さいと確認済みプログラミング言語:何が必要ですか)

おすすめ記事