
ソースツリーを想像してみてください。 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.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
現在のディレクトリに一致する単一のファイルが含まれますfile.xml
。
- シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。これは引用されていない単語
find
のリストにすぎません。.
-name
*.xml
*
- 単語
*.xml
に引用符のないワイルドカードが含まれているため、シェルはファイル名の生成を実行します。*.xml
つまり、一致するファイル名のリストに置き換えられます。 - シェルは
find
結果パラメーターのリスト(例えば、、、.
)-name
を使用してコマンドを実行しますfile.xml
。 find
完全に有効なコマンドが表示されますが、望むものではないかもしれません。一致するファイルを検索する代わりに、すべてのディレクトリで呼び出されたファイルを検索するようにfind
求められます。file.xml
*.xml
(シェルの評価と拡張には他にも多くの機能があります。ここでは関連する機能のみを参照しました。)
(最も一般的なシェル(sh、bash、dash、kshなど)の基本的な動作について説明します。一部のシェルは、拡張されていないワイルドカードでコマンドを実行するのではなく、エラーを表示するか、一致しないワイルドカードをnullに拡張するように構成します。できます。)
答え4
試してみてください:
find ./ -name *.xml