findを使用して特定の拡張子を持つファイルを検索するには?

findを使用して特定の拡張子を持つファイルを検索するには?

私たちは探したいです.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オプション(述部の代わりに)を使用して標準拡張正規表現に切り替えることができます。

別の標準述語があります。-pathlikeは-regexフルパスと一致し、likeは-nameシェルワイルドカードを使用します。

一部の実装では、大文字と小文字を区別せずに一致するように、一部の、、-iname述語-ipathをサポートしています。-iregexGNUは(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を使用しないでください/

おすすめ記事