Saya pikir Anda pernah menggunakan -or
operator, maka Anda harus menjaganya agar tetap konsisten untuk menghindari urutan operasi logis yang ambigu saat Anda memiliki beberapa ketentuan yang terhubung menggunakan OR logis.
Sepertinya -exec
bagian dikelompokkan bersama dengan -name "*.h"
kedua .
Jadi untuk membuatnya berfungsi dengan benar, Anda harus menambahkan tanda kurung seperti di bawah ini:
find . '(' -name '*.cpp' -o -name '*.h' ')' -exec echo {} ';'
Alternatifnya, gabungkan beberapa ekstensi menjadi satu dengan menggunakan -regex
:
find . ! -regex ".*\.\(cpp\|h\)" -exec echo {} \;
Juga tidak. Itu sintaks opsi yang "salah". find
mengevaluasi secara berurutan. Oleh karena itu, ini mengevaluasi ekspresi pertama (-name "*.cpp"
) lalu menemukan -o
bendera. Jika ekspresi pertama benar, find
tidak akan melanjutkan evaluasi yang kedua (-name "*.h" -exec echo {} \;
), bukannya tidak melakukan apa-apa. Anda lihat, seluruh bagian setelah -o
adalah satu ekspresi. Oleh karena itu, ini hanya dijalankan untuk file yang cocok dengan ekspresi kedua. Itu sebabnya Anda hanya melihat 1.h
file, yang hanya meneruskan ekspresi kedua. Lihat halaman manual pencarian:
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
Mengapa ini berguna? Pertimbangkan hal berikut:
find /path -exec test_file_for_something {} -print \; -o -name "xyz" -exec ls -l {} \;
Dalam pernyataan find ini, file diberikan ke test_file_for_something
sebagai parameter. Sekarang, bergantung pada perintah yang mengembalikan kode, ekspresi pertama benar (lalu -print
dieksekusi dan diakhiri di sana) atau false (lalu ekspresi kedua setelah -o
bendera dievaluasi). Dan jika itu benar (namanya adalah xyz
), lalu -exec
dieksekusi.
Untuk masalah Anda, Anda dapat menggunakan ini untuk mengelompokkan elemen bersama sebagai satu ekspresi :
find . \( -name "*.cpp" -o -name "*.h" \) -exec echo {} \;