.dat
以下のコマンドを使用して、すべての*.mk
ファイルの文字列を grep しようとしています。出力が得られないため、これが正しいかどうか疑問に思っています。
find . -name "*.mk" | grep *.dat
いいえ、正しくありません。いくつかの問題があります。1) grep に glob パターンを指定しているようです。2) パターンは引用されておらず、grep が認識する前にシェルによって展開されます。3)ファイルの内容ではなく、ファイル名をgrepします。
1) に対処するには、基本正規表現を使用し.*\.dat
ます.dat
。2) 一重引用符または二重引用符の使用の問題です。3)find
ファイル名を返すので、grep でそれらのファイルのそれぞれを操作したい場合は、-exec
for フラグを使用するか、 をfind
使用しますxargs
。これらすべてをまとめると、次のようになります。
find . -name '*.mk' | xargs grep '.dat'
ここではパイプラインは実際には必要なく、xargsの必要性をバイパスできます。次の呼び出しを使用して、標準のfindコマンドで見つかった各ファイルに対して固定文字列検索 (通常は正規表現一致より高速です) を実行します。
find . -name '*.mk' -exec grep -F .dat {} \;
GNU find を使用している場合は、代わりにこの構文を使用して、grep を複数回呼び出すプロセスのオーバーヘッドを回避できます。
find . -name '*.mk' -exec grep -F .dat {} +
次のように find コマンドで exec オプションを使用します。
find . -name "*.mk" -exec grep ".dat" \{\} \;
xargs を使用します。
find . -name "*.mk"| xargs grep '\.dat'