Saya mencoba menjalankan perintah berikut:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
Ini mengembalikan kesalahan:
find: missing argument to -exec
Saya tidak dapat melihat apa yang salah dengan perintah ini, karena sepertinya cocok dengan halaman manual:
perintah -exec {} +
Varian opsi -exec ini menjalankan perintah yang ditentukan pada file yang dipilih, tetapi baris perintah dibangun dengan menambahkan setiap nama file yang dipilih di akhir; jumlah undangan perintah akan jauh lebih sedikit daripada jumlah file yang cocok. Baris perintah dibangun dengan cara yang sama seperti xargs membangun baris perintahnya. Hanya satu instance dari '{}' diizinkan dalam perintah. Perintah dijalankan di direktori awal.
Saya juga mencoba:
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. Meskipun -exec cmd {} +variannya adalah POSIX dan telah tersedia sejak tahun 80-an, GNU menemukan hanya menambahkannya (relatif) baru-baru ini (2005). Apa yang find --versionmemberitahu Anda?
-exec {} +ditambahkan pada 4.2.12 pada 2005. Dalam penemuan GNU yang lebih lama, Anda dapat menggunakan (non-POSIX) -print0 | xargs -r0untuk mendapatkan yang serupa. 4.1berasal dari 1994.
-nameargumen pola harus dikutip: -name "*.c" -o -name "*.h". Ini benar, meskipun itu tidak terkait dengan -execkesalahan. Anda akan melihat bahwa semua jawaban lain memasukkan tanda kutip ke dalam tanda kutip, meskipun hanya Gilles yang menyebutkannya. … (Lanjutan)
-name "*.[ch]"tanpa penjelasan. Ini memiliki manfaat menyederhanakan baris perintah dan, khususnya, menghilangkan -o. Menemukan ekspresi yang melibatkan -osulit untuk diperbaiki. Anda salah; jika perintah Anda diperbaiki sehingga tidak salah (seperti dalam jawaban Gilles), itu grephanya akan berjalan pada .hfile. Yang perlu Anda lakukan '(' -name '*.c' -o -name '*.h' ')'.
+pada akhirnya?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+