
ファイル数が1つを超えると機能しますが、機能しないのはなぜですかfind . -name "*.jav"
?彼らの機能は何ですか?なぜリテラル文字列として解釈されないのですか?find . -name *.jav
.jav
" "
"*.jav"
答え1
ワイルドカードはコマンドではなくシェルによって拡張されます。find
自分の時間にシェルに似たワイルドカードマッチングを実行する数少ないコマンドの1つです。
を実行すると、最初ls *.jav
にシェルが*.jav
一致するファイルのリスト(たとえば)に展開され、次に結果引数listとともにシェルが呼び出されます。そのため、ファイルについて何も知らず、その引数がファイル名であるかどうかに関係なく、同じファイル名のリストが表示されます。file1.jav
file2.jav
file3.jav
ls
file1.jav
file2.jav
file3.jav
echo *.jav
echo
実行時find . -name "*.jav"
:
- シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。引用された単語
find
、.
のリストのみがあります。引用されているので、シェルに関する限り、これは一般的な文字です。-name
*.jav
*
*
- シェルは、
find
指定された引数リスト(.
、、、-name
)を使用してコマンドを実行します*.jav
。 find
*.jav
現在のディレクトリの下のすべてのディレクトリで、パターンと一致する名前のファイルを探します。
実行したがfind . -name *.jav
一致するファイルがない場合*.jav
:
- シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。これは引用されていない単語
find
のリストにすぎません。.
-name
*.jav
*
- 単語に
*.jav
引用符がないワイルドカードが含まれているため、シェルはファイル名の生成を実行します。一致するファイル名がないため、パターンは拡張されていません。 - シェルは
find
結果パラメーターのリスト(例えば、、、.
)-name
を使用してコマンドを実行します*.jav
。 find
*.jav
現在のディレクトリの下のすべてのディレクトリで、パターンと一致する名前のファイルを探します。
実行すると、find . -name *.jav
現在のディレクトリにfile1.jav
、file2.jav
および次が含まれますfile3.jav
。
- シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。これは引用されていない単語
find
のリストにすぎません。.
-name
*.jav
*
- 単語
*.jav
に引用符のないワイルドカードが含まれているため、シェルはファイル名の生成を実行します。*.jav
つまり、一致するファイル名のリストに置き換えられます。 - シェルは、
find
結果引数のリスト(たとえば、、、、、、.
など)を使用してコマンドを実行します。-name
file1.jav
file2.jav
file3.jav
find
到着時に構文エラーについて文句を言いますfile2.jav
。
実行すると、find . -name *.jav
現在のディレクトリに一致する単一のファイルが含まれますfile.jav
。
- シェルはコマンドラインを解析して特殊文字を識別し、それを単語と句読点に分割します。これは引用されていない単語
find
のリストにすぎません。.
-name
*.jav
*
- 単語
*.jav
に引用符のないワイルドカードが含まれているため、シェルはファイル名の生成を実行します。*.jav
つまり、一致するファイル名のリストに置き換えられます。 - シェルは
find
結果パラメーターのリスト(例えば、、、.
)-name
を使用してコマンドを実行しますfile.jav
。 find
完全に有効なコマンドが表示されますが、望むものではないかもしれません。一致するファイルを検索する代わりに、すべてのディレクトリで呼び出されたファイルを検索するようにfind
求められます。file.jav
*.jav
(シェルの評価と拡張には他にも多くの機能があります。ここでは関連する機能のみを参照しました。)
(最も一般的なシェル(sh、bash、dash、kshなど)の基本的な動作について説明します。一部のシェルは、拡張されていないワイルドカードでコマンドを実行するのではなく、エラーを表示するか、一致しないワイルドカードをnullに拡張するように構成します。できます。)