GNU/Linux >> Belajar Linux >  >> Linux

Mengapa `find` di Linux melewatkan hasil yang diharapkan saat `-o` digunakan?

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 {} \;

Linux
  1. Apa itu POSIX? Mengapa Penting bagi Pengguna Linux/UNIX?

  2. Mengapa Sinkronisasi Sangat Penting Saat Membuat Stik Usb Linux yang Dapat Di-boot?

  3. Linux – Mengapa Usb Tidak Berfungsi Di Linux Saat Berfungsi Di UEFA/bios?

  1. Linux – Mengapa Perlu Waktu Lama Untuk Mendeteksi Usb Stick?

  2. Mengapa pipa shell ini keluar?

  3. Mengapa kami memiliki 3 jenis pilihan-X di LINUX?

  1. Mengapa Ctrl + V tidak menempel di Bash (Linux shell)?

  2. Mengapa Linux memanaskan komputer saya?

  3. Mengapa lalu lintas jaringan Linux hanya melewati eth0?