パラメータ-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
に置き換えられることを意味します。あなたの場合、引数として渡された2つ以上の一致するファイルがあるようです。どうすればいいのかわからず、引数リストが長すぎると文句を言います。*.out
.out
find
find
パターンを引用するとシェルはそのまま残り、引用符を削除するとfind
変更されていないパラメータが表示されます*.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")
たぶん私は質問を誤解したのでしょうか?