入力ファイルがありますが、これをscan.dataと呼びます。これには、私が把握したい単語のリストが含まれています。私はこれを行う2つの異なる方法を見つけましたが、結果は非常に異なります。
IFS=$' '
find / -type f -exec grep -a -D skip -wo $(<scan.data) '{}' \;
これは3,799のゲームを提供します。
find / -type f -exec grep -a -D skip -of scan.data '{}' \;
これは私に18,167のゲームを提供します。
私が理解したように、IFSを設定すると、サブシェルの内容をリストとして出力でき、デフォルトで2番目のケースの機能をミラーリングできます。それでは、二人の結果がこのように大きな違いを示す理由は何だろうか?
ベストアンサー1
コマンド置換が引用されていて(そうでない場合のほとんどの単語はscan.data
実行するファイル名として扱われますgrep
)、ファイルの最初の単語がダッシュで始まらないと仮定します(そうであれば、おそらくオプションとして解釈されます)。grep
両方の呼び出しは、使用されたオプションを除いて本質的に同じです。最初のバリアントには大量のデータが含まれていると、scan.data
「パラメータのリストが長すぎます。」エラーが発生する可能性もあります。
- 最初は正規
grep
表現-w
で読み取ったパターンを使用してscan.data
一致を試みます。完全な言葉find
ユーティリティに提供されたファイルの各行でthe
(いいえ)の先頭に一致しますtheodore
。 - 2番目は
grep
使用されません-w
。正規表現から読み取ったパターンを使用してscan.data
一致を試みます。サブストリングfind
ユーティリティに提供されたファイルの各行に(the
の先頭で一致theodore
)
これはあなたが得る一致数の違いを説明することができます。
ユーティリティがファイルのパターンを正規表現-F
ではなく文字列として使用したい場合(パターンファイルの正規表現に特殊文字が含まれているが文字通り一致する必要がある場合など)。grep
scan.data
.
[
*
ファイルにパターンがある場合-f
。コマンド置換を使用することは可能ですが、制限されている場合にのみ可能です(この回答の上部に記載されているように、最初の文字列には初期ダッシュがなく、適切な量の文字列しかありません)。このオプションがある場合は、-f
コマンド置換の使用はまったく必要ありません。