パラメータと一致する値を二重引用符でマークする必要がある-name
のはなぜですか?find
# find / -type f -name *.out |wc -l 1>mv.out
0403-027 The parameter list is too long.
# cat mv.out
0
# find / -type f -name "*.out" |wc -l 1>mv.out
# cat mv.out
146302
答え1
二重引用符がない場合、 は*.out
シェルによって展開され、現在のディレクトリ内の一致するすべてのファイル名*.out
(主にドットで終わり.out
、ドットで始まらないファイル) に置き換えられます。あなたの場合、一致するファイルが少なくとも 2 つあり、パラメータとして渡されているようですfind
。find
は、それらをどう処理すればよいか分からず、パラメータ リストが長すぎるというエラーを出します。
パターンを引用符で囲むと、シェルはそれをそのままにして、引用符を削除するだけで、find
変更されていない 1 つのパラメータを認識します*.out
。これはおそらく意図したとおりです。
答え2
これが正確に正しいかどうかはわかりません。ただし、引用符で囲むと、パーサーが正規表現として読み取るようになると思います。引用符がない場合、アスタリスクは現在のディレクトリ内のすべてのファイルを表すと思います。
次の出力の違いを確認してください。
$ echo $(find ./ -name *)
そして
$ echo $(find ./ -name "*")
したがって、最初のコマンドではエラーが発生する可能性があります。ファイルがある場合フー&バー現在のディレクトリでは、アスタリスクはファイル名を表します。したがって、コマンド パーサーは次のようにコマンドを読み取ります。
$ echo $(find ./ -name foo bar)
エラー出力は次のようになりますfind: bar: unknown primary or operator
。
2 番目のコマンドは、アスタリスクを正規表現として読み取り、任意のファイル名の検索を示します。
編集:しかし、コマンドをさらにテストしたところ、私のシステムでは、テキストがアスタリスクと組み合わされている限り、引数値が引用符で囲まれているかどうかに関係なく機能するようです。
$ echo $(find ./ -name *foo)
と同じです
$ echo $(find ./ -name "*foo")
おそらく私は質問を誤解しているのでしょうか?