find のパラメータ -name で一致した値に使用される二重引用符

find のパラメータ -name で一致した値に使用される二重引用符

パラメータと一致する値を二重引用符でマークする必要がある-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 つあり、パラメータとして渡されているようですfindfindは、それらをどう処理すればよいか分からず、パラメータ リストが長すぎるというエラーを出します。

パターンを引用符で囲むと、シェルはそれをそのままにして、引用符を削除するだけで、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")

おそらく私は質問を誤解しているのでしょうか?

関連情報