web-dev-qa-db-ja.com

ファイルが一番上にあるときに再帰的ではないことがわかります

ソースツリーを想像してみてください。至る所にxmlファイルがあります。

しかし、このツリーのルートにXYZ.xmlがあるため、xmlファイルが見つかりません。

find -iname *.xml

戻り値

./XYZ.xml

の代わりに

./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
8
Olivier Toupin
find -iname '*.xml'

それ以外の場合、シェルは*.xmlXYZ.xmlに展開し、実際に実行されるコマンドは

find -iname XYZ.xml

現在のディレクトリにXMLファイルがない場合に機能する理由は、シェルは通常、ワイルドカードが何にも一致しない場合、ワイルドカードを展開しないままにするためです。一般に、ワイルドカードをシェル以外のプログラム(たとえば、findtarscpなど)で展開する場合は、ワイルドカードを引用する必要があります。そのため、シェルはそれら自体を拡張しようとはしません。

18
cjm

あなたはこのようにあなたの議論を引用する必要があります:

find ./ -name '*.xml'

シェルによって拡張されるのではなく、findに渡され、拡張バージョンとしてfindに渡されるようにします。

6
Caleb

ワイルドカードは、コマンドではなくシェルによって展開されます。 findは、シェルと同様のワイルドカードマッチングを独自の時間に実行する数少ないコマンドの1つです。

ls *.xmlを実行すると、最初にシェルが*.xmlを一致するファイルのリストに展開します。 file1.xmlfile2.xmlfile3.xml次に、シェルはlsを呼び出し、結果として得られる引数のリストfile1.xmlfile2.xmlfile3.xmlを返します。そのため、echoはファイルについて何も知らず、引数がファイル名であるかどうかを気にしない場合でも、echo *.xmlと同じファイル名のリストが表示されます。

find . -name "*.xml"を実行すると:

  1. シェルはコマンドラインを解析して特殊文字を認識し、単語とパンチュエーションに分割します。ここに、find.-name*.xmlの単語のリストがあり、*が引用されています。 *が引用されているので、シェルに関する限り、それは普通の文字です。
  2. シェルは、指定された引数のリスト.-name*.xmlを使用してコマンドfindを実行します。
  3. findは、現在のディレクトリの下の任意のディレクトリで、パターン*.xmlと名前が一致するファイルを検索します。

find . -name *.xmlを実行し、*.xmlに一致するファイルがない場合:

  1. シェルはコマンドラインを解析して特殊文字を認識し、単語とパンチュエーションに分割します。ここに、find.-name*.xmlの単語のリストがありますが、*は引用符で囲まれていません。
  2. Word *.xmlには引用符で囲まれていないワイルドカード文字が含まれているため、シェルはファイル名の生成を実行します。一致するファイル名がないため、パターンは展開されません。
  3. シェルはコマンドfindを実行し、引数の結果リストは.-name*.xmlになります。
  4. findは、現在のディレクトリの下の任意のディレクトリで、パターン*.xmlと名前が一致するファイルを検索します。

find . -name *.xmlを実行し、現在のディレクトリにfile1.xmlfile2.xml、およびfile3.xmlが含まれている場合:

  1. シェルはコマンドラインを解析して特殊文字を認識し、単語とパンチュエーションに分割します。ここに、find.-name*.xmlの単語のリストがありますが、*は引用符で囲まれていません。
  2. Word *.xmlには引用符で囲まれていないワイルドカード文字が含まれているため、シェルはファイル名の生成を実行します。*.xmlは一致するファイル名のリストに置き換えられます。
  3. シェルはコマンドfindを実行し、引数の結果リストは.-namefile1.xmlfile2.xmlfile3.xmlです。
  4. findは、file2.xmlに達すると構文エラーについて文句を言います。

find . -name *.xmlを実行し、現在のディレクトリに1つの一致するファイルfile.xmlが含まれている場合:

  1. シェルはコマンドラインを解析して特殊文字を認識し、単語とパンチュエーションに分割します。ここに、find.-name*.xmlの単語のリストがありますが、*は引用符で囲まれていません。
  2. Word *.xmlには引用符で囲まれていないワイルドカード文字が含まれているため、シェルはファイル名の生成を実行します。*.xmlは一致するファイル名のリストに置き換えられます。
  3. シェルはコマンドfindを実行し、引数の結果リストは.-namefile.xmlになります。
  4. findは完全に有効なコマンドを認識しますが、おそらく意図したものではありません。findは、一致するファイルを検索するのではなく、任意のディレクトリでfile.xmlというファイルを検索するように指示されます。 *.xml

(シェルの評価と拡張には他にも多くの機能があります。ここでは、関連する機能についてのみ説明しました。)

(私が説明するのは、最も一般的なシェルのデフォルトの動作です:sh、bash、dash、ksh、…一部のシェルは、展開されていないワイルドカードでコマンドを実行する代わりにエラーを表示するように、または一致しないワイルドカードを空に展開するように構成できますリスト。それらのどれもここでは役に立ちません。)