
私たちは探したいです.hprof
。/var
違いは何ですか
find /var -type f -regex '.*\.hprof'
/var/ff-efre-ferg-fr.hprof
そして
find /var -type f -name "*.hprof"
/var/ff-efre-ferg-fr.hprof
それとも検索方法はまったく同じですか?
答え1
述語は-name
標準であり、ファイル名のみが一致し、シェルワイルドカード構文を使用します。
これは一部の実装でサポートされている-regex
非標準の拡張ですが、構文がfind
異なり、完全なパス(ここで提供されているパス引数で始まる/opt
)と一致します。
基本構文は正規表現の一部の形式です。たとえば、GNU find
、GNUemacs
正規表現を使用すると、-regextype
述語でさまざまな正規表現タイプを使用できます。一部のBSDでは、これは標準の基本正規表現であり、-E
オプション(述部の代わりに)を使用して標準拡張正規表現に切り替えることができます。
別の標準述語があります。-path
likeは-regex
フルパスと一致し、likeは-name
シェルワイルドカードを使用します。
一部の実装では、大文字と小文字を区別せずに一致するように、一部の、、-iname
述語-ipath
をサポートしています。-iregex
GNUは(rmsオブジェクトを単語として)サポートfind
します。-wholename
-path
道一部のディレクトリコンポーネントを含む完全なファイル名を示します。
find /opt -type f -regex '.*\.hprof'
そして
find /opt -type f -path '*.hprof'
サポートされている-regex
ワイルドカード*
と正規表現(すべてのバリエーション).*
は。任意数の文字。
彼らは異なる結果を与えることができます
find /opt -type f -name '*.hprof'
パスコンポーネント(名前を除く)にロケールで有効な文字を形成しない一連のバイトを含むファイルの場合。
$ mkdir $'St\351phane'
$ touch $'St\351phane/file.hprof'
$ locale charmap
UTF-8
$ find . -regex '.*\.hprof'
$ find . -path '*.hprof'
$ find . -name '*.hprof'
./St?phane/file.hprof
これはディレクトリですが、UTF-8ではなくiso8859-1(0351、0xe9)でStéphane
エンコードされています。é
UTF-8ロケールでは、この0xe9バイトは文字にマップされないため、正規表現.
やワイルドカード*
(少なくともGNUの場合find
)と一致しません。ただし、ファイルのデフォルト名(file.hprof
)は大丈夫なので-name
一致します。
移植性と信頼性を最大化するためのいくつかの経験則:
-name
*.hprof
ここで、拡張子検索など、ファイル名のみを一致させ、ファイルが存在するディレクトリを一致させる必要がない場合(ワイルドカード構文で十分)に使用してください。-path
ファイルがある場所も一致させる必要がある場合(例find . -path ./special-dir -prune -o -type f -print
:)(ワイルドカード構文で十分)を使用してください。-regex
ワイルドカードが不十分な場合は、ワイルドカードを使用するがターゲットにする必要がある実装のサポートを確認し、正規表現の構文が異なる可能性があることに注意してください。ファイル名のみを一致させる必要がある場合は、canmatchを使用しないでください/
。