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 --version
memberitahu Anda?
-exec {} +
ditambahkan pada 4.2.12 pada 2005. Dalam penemuan GNU yang lebih lama, Anda dapat menggunakan (non-POSIX) -print0 | xargs -r0
untuk mendapatkan yang serupa. 4.1
berasal dari 1994.
-name
argumen pola harus dikutip: -name "*.c" -o -name "*.h"
. Ini benar, meskipun itu tidak terkait dengan -exec
kesalahan. 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 -o
sulit untuk diperbaiki. Anda salah; jika perintah Anda diperbaiki sehingga tidak salah (seperti dalam jawaban Gilles), itu grep
hanya akan berjalan pada .h
file. 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 '{}' \+