次のコマンドを実行しようとしています。
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
エラーが返されます。
find: missing argument to -exec
マンページと一致しているように見えるので、このコマンドにどのような問題があるのかわかりません。
- コマンドの実行{}+
-execオプションのこのバリアントは、選択したファイルに対して指定されたコマンドを実行しますが、コマンドラインは選択した各ファイル名を最後に追加することによって構成されます。コマンドの総呼び出し数は、一致するファイルの数よりはるかに少なくなります。コマンドラインは、xargsがコマンドラインを作成するのとほぼ同じ方法で作成されます。コマンドには「{}」インスタンスが1つだけ許可されます。このコマンドは起動ディレクトリで実行されます。
私も次のことを試しました。
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
ベストアンサー1
引用符の代わりにバックティックを使用します(質問の後続の編集から削除されます)、必要に応じて引用符の欠落、無用な追加の引用符、グループ化句の括弧の欠落、および使用されている-o
他find
の実装(詳細についてはコメントとチャットを参照してください。)
とにかく、コマンドは次のように単純化できます。
find a/folder b/folder -name "*.[ch]" -exec grep -I foobar {} +
あるいは、古代のGNU検索バージョンを使用している場合は常に機能します。
find a/folder b/folder -name "*.[ch]" -exec grep -I foobar {} \;