次のコマンドを実行しようとしています:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
これはエラーを返しています:
find: missing argument to -exec
このコマンドの何が問題なのかわかりません。マニュアルページと一致しているようです。
-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 '{}' \+
find
。けれども-exec cmd {} +
バリアントがPOSIXで、80年代以来利用されている、GNUは、それだけの(比較的)最近(2005年)を加え見つけます。何がfind --version
わかりますか?
-exec {} +
2005年の4.2.12に追加されました。古いGNUの発見では、(非POSIX)-print0 | xargs -r0
を使用して同様のものを取得できます。4.1
1994
-name
パターン引数を引用する必要があることを(削除された回答で)指摘しました-name "*.c" -o -name "*.h"
。-exec
エラーとは無関係ですが、これは事実です。他のすべての回答ではワイルドカードが引用符で囲まれていますが、Gillesだけが言及しています。…(続き)
-name "*.[ch]"
説明なしに崩壊させます。これには、コマンドラインを簡素化し、具体的には、 -o
。関係-o
する式を見つけるのは難しいです。あなたのものは間違っています。エラーが発生しないようにコマンドが修正されている場合(Gillesの答えのように)、ファイルに対してgrep
のみ実行され.h
ます。あなたがする必要があります'(' -name '*.c' -o -name '*.h' ')'
。
+
最後にエスケープを試みましたか?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+