コマンドラインにパターンがある場合、検索は繰り返されません。

コマンドラインにパターンがある場合、検索は繰り返されません。

ソースツリーを想像してみてください。 xmlファイルはどこにでもあります。

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

find -iname *.xml

返品

./XYZ.xml

変える

./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml

答え1

find -iname '*.xml'

それ以外の場合は、シェルが*.xml拡張されXYZ.xml、実際に実行されるコマンドは次のとおりです。

find -iname XYZ.xml

現在のディレクトリにXMLファイルがない場合に動作するのは、通常、シェルが一致しないワイルドカードを拡張しないためです。通常、シェルの外側のプログラム(例えば、、findなどtar)によってワイルドカード文字を拡張したい場合は、scpシェルがそれ自体を拡張しようとしないようにその文字を引用する必要があります。

答え2

次のように自分の主張を引用する必要があります。

find ./ -name '*.xml'

この方法では、シェルによって拡張されずに find に渡され、次に拡張バージョンに find に渡されます。

答え3

ワイルドカードはコマンドではなくシェルによって拡張されます。find自分の時間にシェルに似たワイルドカードマッチングを実行する数少ないコマンドの1つです。

を実行すると、最初ls *.xmlにシェルが*.xml一致するファイルのリスト(たとえば)に展開され、次に結果引数listとともにシェルが呼び出されます。そのため、ファイルについて何も知らず、その引数がファイル名であるかどうかに関係なく、同じファイル名のリストが表示されます。file1.xml file2.xml file3.xmllsfile1.xml file2.xml file3.xmlecho *.xmlecho

実行時find . -name "*.xml"

  1. シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。引用された単語find.のリストのみがあります。引用されているので、シェルに関する限り、これは一般的な文字です。-name*.xml**
  2. シェルは、find指定された引数リスト(.、、、-name)を使用してコマンドを実行します*.xml
  3. find*.xml現在のディレクトリの下のすべてのディレクトリで、パターンと一致する名前のファイルを探します。

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

  1. シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。これは引用されていない単語findのリストにすぎません。.-name*.xml*
  2. 単語に*.xml引用符がないワイルドカードが含まれているため、シェルはファイル名の生成を実行します。一致するファイル名がないため、パターンは拡張されていません。
  3. シェルはfind結果パラメーターのリスト(例えば、、、.-nameを使用してコマンドを実行します*.xml
  4. find*.xml現在のディレクトリの下のすべてのディレクトリで、パターンと一致する名前のファイルを探します。

実行すると、find . -name *.xml現在のディレクトリにfile1.xmlfile2.xmlおよび次が含まれますfile3.xml

  1. シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。これは引用されていない単語findのリストにすぎません。.-name*.xml*
  2. 単語*.xmlに引用符のないワイルドカードが含まれているため、シェルはファイル名の生成を実行します。*.xmlつまり、一致するファイル名のリストに置き換えられます。
  3. シェルは、find結果引数のリスト(たとえば、、、、、、.など)を使用してコマンドを実行します。-namefile1.xmlfile2.xmlfile3.xml
  4. find到着時に構文エラーについて文句を言いますfile2.xml

実行すると、find . -name *.xml現在のディレクトリに一致する単一のファイルが含まれますfile.xml

  1. シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。これは引用されていない単語findのリストにすぎません。.-name*.xml*
  2. 単語*.xmlに引用符のないワイルドカードが含まれているため、シェルはファイル名の生成を実行します。*.xmlつまり、一致するファイル名のリストに置き換えられます。
  3. シェルはfind結果パラメーターのリスト(例えば、、、.-nameを使用してコマンドを実行しますfile.xml
  4. find完全に有効なコマンドが表示されますが、望むものではないかもしれません。一致するファイルを検索する代わりに、すべてのディレクトリで呼び出されたファイルを検索するようにfind求められます。file.xml*.xml

(シェルの評価と拡張には他にも多くの機能があります。ここでは関連する機能のみを参照しました。)

(最も一般的なシェル(sh、bash、dash、kshなど)の基本的な動作について説明します。一部のシェルは、拡張されていないワイルドカードでコマンドを実行するのではなく、エラーを表示するか、一致しないワイルドカードをnullに拡張するように構成します。できます。)

答え4

試してみてください:

find ./ -name *.xml

関連情報