Linux/Macのfindコマンドの\*.xml
との違いは何ですか?*.xml
の結果:
find . -name \*.xml and find . -name *.xml
違います。でも、なぜでしょうか?
また、locate '*.xml'
find よりも優れているのはどれですか? 最もよく使用されるのはどれですか?
答え1
find
アスタリスクをエスケープすると、一致するリテラル文字列が提供され*.xml
、シェルに関係なく、内部的にワイルドカードとして解析される可能性があります。アスタリスクをエスケープまたは引用符で囲まなかった場合、コマンドによって変更される前に、シェルによってアスタリスクが展開されますfind
。
たとえば、somefile.xml
ディレクトリ内にファイルが 1 つしかない場合、シェルはワイルドカードを展開し、リテラル文字列をsomefile.xml
コマンドに渡します。つまり、次のようになります。
sh-4.1$ find . -name *.xml
これは次のものと全く同じです:
sh-4.1$ find . -name somefile.xml
これは、正確なファイル名にのみ一致します。ディレクトリ内に*.xml
ワイルドカードに一致するファイルが 2 つある場合、ワイルドカードが展開されると構文エラーが発生する可能性があります。
sh-4.1$ find . -name somefile.xml someotherfile.xml
find: paths must precede expression: someotherfile.xml
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
どちらが優れているかはlocate
、実際に何に使うかによります。 はlocate
はるかに高速ですが、事前に構築されたインデックスに依存しているため、最新のインデックス更新 (通常は毎日行われますが、ディストリビューションによって異なります) と同等の性能しかありません。また、ファイル名の一致に基づいて結果を返すだけですが、 ではfind
検索を絞り込むためのオプションが豊富に用意されています。