ソースツリーを想像してみてください。至る所にxmlファイルがあります。
しかし、このツリーのルートにXYZ.xmlがあるため、xmlファイルが見つかりません。
find -iname *.xml
戻り値
./XYZ.xml
の代わりに
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
find -iname '*.xml'
それ以外の場合、シェルは*.xml
をXYZ.xml
に展開し、実際に実行されるコマンドは
find -iname XYZ.xml
現在のディレクトリにXMLファイルがない場合に機能する理由は、シェルは通常、ワイルドカードが何にも一致しない場合、ワイルドカードを展開しないままにするためです。一般に、ワイルドカードをシェル以外のプログラム(たとえば、find
、tar
、scp
など)で展開する場合は、ワイルドカードを引用する必要があります。そのため、シェルはそれら自体を拡張しようとはしません。
あなたはこのようにあなたの議論を引用する必要があります:
find ./ -name '*.xml'
シェルによって拡張されるのではなく、findに渡され、拡張バージョンとしてfindに渡されるようにします。
ワイルドカードは、コマンドではなくシェルによって展開されます。 find
は、シェルと同様のワイルドカードマッチングを独自の時間に実行する数少ないコマンドの1つです。
ls *.xml
を実行すると、最初にシェルが*.xml
を一致するファイルのリストに展開します。 file1.xml
file2.xml
file3.xml
次に、シェルはls
を呼び出し、結果として得られる引数のリストfile1.xml
file2.xml
file3.xml
を返します。そのため、echo
はファイルについて何も知らず、引数がファイル名であるかどうかを気にしない場合でも、echo *.xml
と同じファイル名のリストが表示されます。
find . -name "*.xml"
を実行すると:
find
、.
、-name
、*.xml
の単語のリストがあり、*
が引用されています。 *
が引用されているので、シェルに関する限り、それは普通の文字です。.
、-name
、*.xml
を使用してコマンドfind
を実行します。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、…一部のシェルは、展開されていないワイルドカードでコマンドを実行する代わりにエラーを表示するように、または一致しないワイルドカードを空に展開するように構成できますリスト。それらのどれもここでは役に立ちません。)