回答:
find -iname '*.xml'
そうでない場合、シェルはに展開さ*.xmlれXYZ.xml、実際に実行されるコマンドは
find -iname XYZ.xml
現在のディレクトリにXMLファイルがない場合に機能する理由は、シェルは通常、一致するものがない場合、ワイルドカードを展開しないでおくためです。一般的に、あなたはワイルドカードはシェル以外のプログラムによって拡張することにしたい任意の時間(例えばによってfind、tar、scp、など)あなたはシェルがそれら自体を拡大しようとはしませんので、それらを引用する必要があります。
bashはないという意味でそれを意味していたと思いfindます。
次のように引数を引用する必要があります。
find ./ -name '*.xml'
シェルによって展開されるのではなく、findに渡されてから、展開されたバージョンとしてfindに渡されます。
*.xml現在のディレクトリに一致しない場合、文字通り渡されます。それが、他のケースでも機能する理由です。非常に役立つ答え。
ワイルドカードは、コマンドではなくシェルによって展開されます。findシェルに似たワイルドカードマッチングを実行する数少ないコマンドの1つです。
を実行するとls *.xml、最初にシェル*.xmlが一致するファイルのリスト(たとえばfile1.xml file2.xml file3.xml)に展開され、次にシェルはls結果の引数のリストを使用して呼び出しますfile1.xml file2.xml file3.xml。そのため、ファイルについて何echo *.xmlもecho知らず、引数がファイル名であるかどうかを気にしなくても、で同じファイル名のリストが表示されます。
実行するとfind . -name "*.xml":
find、.、-name、引用されているが。が引用されているので、シェルに関する限り、これは普通の文字です。*.xml**find、引数の指定されたリストに:.、-name、*.xml。find*.xml現在のディレクトリの下の任意のディレクトリで、パターンに一致する名前のファイルを検索します。実行find . -name *.xmlして一致するファイルがない場合*.xml:
find、.、-name、引用されていませんが。*.xml**.xmlには引用符で囲まれていないワイルドカード文字が含まれているため、シェルはファイル名の生成を実行します。一致するファイル名がないため、パターンは拡張されません。findている引数の結果リスト、と.、-name、*.xml。find*.xml現在のディレクトリの下の任意のディレクトリで、パターンに一致する名前のファイルを検索します。実行するfind . -name *.xmlと、現在のディレクトリにfile1.xml、file2.xmlおよびが含まれますfile3.xml。
find、.、-name、引用されていませんが。*.xml**.xmlには引用符で囲まれていないワイルドカード文字が含まれているため、シェルはファイル名の生成を実行します。これ*.xmlは、一致するファイル名のリストに置き換えられます。findている引数の結果リスト、と.、-name、file1.xml、file2.xml、file3.xml。findに達すると、構文エラーについて文句を言いますfile2.xml。を実行find . -name *.xmlし、現在のディレクトリに一致するファイルが1つ含まれている場合file.xml:
find、.、-name、引用されていませんが。*.xml**.xmlには引用符で囲まれていないワイルドカード文字が含まれているため、シェルはファイル名の生成を実行します。これ*.xmlは、一致するファイル名のリストに置き換えられます。findている引数の結果リスト、と.、-name、file.xml。find完全に有効なコマンドがfind表示されますが、おそらく意図したものではありません。file.xmlファイルの一致を探すのではなく、任意のディレクトリで呼び出されたファイルを探すように指示されます*.xml。(シェルの評価と拡張には他にも多くの機能があります。ここでは、関連する機能のみを説明しました。)
(私が説明するのは、最も一般的なシェルのデフォルトの動作です:sh、bash、dash、ksh、...リスト。これらはどれもここでは役に立ちません。)
してみてください:
find ./ -name *.xml
*常に引用されたかを見つけるためにそれを渡すようにエスケープする必要があります。
man find:もちろんパターンを引用する必要があることに注意してください。そうしないと、シェルがそれらのワイルドカード文字を展開します。