GNU find -notとGNU find -prune -o -printの違い

GNU find -notとGNU find -prune -o -printの違い

[条件]を除いて、vimですべてのファイルを開く方法の答えは次のとおりです。

https://unix.stackexchange.com/a/149356/98426

同様の答えをしました。

find . \( -name '.?*' -prune \) -o -type f -print

(私の質問はvimとは関係がないので答えを修正しました)

負の条件はエスケープされた括弧で囲まれています。しかし、私のテストファイルには次の内容があります。

find . -type f -not -name '^.*'

同じ結果を生成しますが、読み書きが簡単です。 -notメソッドは-pruneメソッドと同じです。-notと-prune -o -printメソッドが異なる結果を生み出す極端なケースが何であるか疑問に思います。

Findutilsの情報ページは次のとおりです。

- いいえ表現:exprが偽ならば真

-prune:ファイルがディレクトリの場合は、そのディレクトリを入力しないでください。 (そして実際には最上位の一致ディレクトリを除外するために-o -printの必要性をさらに説明するため)

-notはテストで、-pruneは操作なので、このように比較するのは難しいようですが、私にとってはそれらが交換可能です(-o -printが-pruneに従う限り)。

答え1

-notまず、これは標準演算子と同等のGNU拡張であることに注意してください!。これに比べて利点はほとんどありません!

述語は-prune常に次のように評価されます。本物そして、ディレクトリツリーの移動方法に影響しますfind。実行するファイルが-prune次の種類の場合目次(おそらく-L//を使用してシンボリックリンクを確認した後に決定されます)。-H-followfind

したがって、-name 'pattern' -prune(の略語-name 'pattern' -a -prune)は次のようになります。-name 'pattern'名前が一致するディレクトリだけが次のようpatternになります。手入れされたそうすれば、find彼らにはそのようなことは起こらないでしょう。

-name '.?*'.名前が 1 で始まるファイルと一致します。特徴(定義は現在のロケールによって異なります)の後に0以上が続きます。数値。したがって、実際には.1つ以上の文字とそれに続く文字と一致します(.開始ディレクトリが切り捨てられるのを防ぐため)。

したがって、これは隠されたファイルと一致しますが、注意すべき点は、名前が次のようにすべて設定されたファイルのみと一致することです。数値つまり、現在のロケールの有効なテキストです(少なくともGNU実装の場合)。

だからここでは、

find . \( -name '.?*' -a -prune \) -o -type f -a -print

どちらが同じですか?

find . -name '.?*' -prune -o -type f -print

AND(-a暗黙的)がOR()よりも優先されるためです-o

次のファイルを探す定期的な(シンボリックリンク、ディレクトリ、fifos、デバイスなどはありません)非表示と非表示のディレクトリにはありません(すべてのファイルパスがロケールで有効なテキストであると仮定)。

find . -type f -not -name '^.*'

またはそれに対応する標準:

find . -type f ! -name '^.*'

で終わらない名前を見つけます^.

find . -type f ! -name '.*'

名前で始まらない通常のファイルは見つかりますが、.非表示のディレクトリにあるファイルは報告され続けます。

find . -type f ! -path '*/.*'

隠しファイルと隠しディレクトリのファイルは無視されますが、findその中のすべてのファイルをスキップするために隠しディレクトリ(すべてのレベルの深さ)にドロップダウンし続けるので、使用するよりも優れています-prune

答え2

-prunein 述部はfind検索ツリーの分岐を削除します。したがって、-prune 質問の最初のコマンドでasを使用すると、ディレクトリに隠された名前のファイルがない場合は、2番目のコマンドと同じ結果が得られます。

例:

$ tree -a
.
|-- .hiddendir
|   `-- file
`-- dir
    `-- file

2 directories, 2 files
$ find . \( -name '.?*' -prune \) -o -type f -print
./dir/file
$ find . -type f ! -name '.*'
./dir/file
./.hiddendir/file

-nameあなたが言葉にならない正規表現を使用しているようで、ここでテストを修正し、非!標準の代わりにそれを使用しました-not)。

ご覧のとおり、名前は.hiddendirワイルドカードパターンと一致するため、最初のコマンドを.?*使用すると検索ツリーから削除され、fileその下のファイルは見つかりません。

2番目のコマンドでは、.hiddendirディレクトリは検索ツリーから削除されないため、ディレクトリfile内のファイルを見つけることができます。

関連情報