回答:
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
:もちろんパターンを引用する必要があることに注意してください。そうしないと、シェルがそれらのワイルドカード文字を展開します。