Bagaimana cara saya mendapatkan grep untuk mengecualikan jalur tertentu?

3

Catatan: Ini BUKAN duplikat. Saya berurusan dengan contoh tertentu di mana opsi grep untuk mengecualikan jalur / direktori tidak berlaku dengan cara yang diharapkan.

Saya mencoba menggunakan grep untuk secara rekursif mencari sistem file root saya. Saya mencoba untuk mengecualikan direktori tertentu seperti /proc, /sys, dan /usr/local. Jika saya gunakan --exclude-dir=${DIR_NAME}, maka itu tidak akan mencari di jalur di bawah ${DIR_NAME}, tetapi ini juga berarti bahwa itu akan menolak untuk mencari jalur di bawah ${DIR_NAME}jika ${DIR_NAME}berada pada level di bawah direktori kerja saat ini. Sebagai contoh, pertimbangkan pohon sistem file ini:

${PWD}/
  data/
    settings/
      sys/
    users/
      developer/
        projects/
          my_os/
            build/
            src/
              apps/
              sys/
            Makefile
  extras/
  sys/
    apps/
    os/

Jika saya ingin pencarian saya dikecualikan ${PWD}/sysdan semua yang ada di dalamnya, grep -rl --exclude-dir=sysakan mengecualikannya, tetapi itu juga akan mengecualikan ${PWD}/data/settings/sysdan ${PWD}/users/developer/projects/my_os/src/sys, dua direktori saya ingin dimasukkan dalam pencarian saya.

Saya awalnya berharap bahwa --exclude-dir/ --excludeakan memungkinkan untuk ekspresi reguler dan saya telah menemukan komentar ini menunjukkan bahwa mereka melakukannya, tetapi tampaknya sintaks ekspresi reguler tidak mempengaruhi perilaku utilitas (misalnya, "^/(dev|proc)"). Saya baik-baik saja jika kedua opsi tersebut tidak menggunakan ekspresi reguler, tetapi saya tidak ingin pola pengecualian diterapkan ke komponen jalur tunggal. Apakah ada cara untuk membuatnya bekerja seperti itu?

Melab
sumber

Jawaban:

1

Cukup gunakan ini:

grep -r "text" | grep -i -v ^sys/ 

Anda dapat menambahkan begitu banyak "| grep -i -v ^ dir /" sesuai kebutuhan.

Pm Zaek
sumber
Grep pertama masih akan mencari direktori tersebut. Jadi ketika Anda mendapatkan 'file' seperti /dev/randomdan /dev/zero, itu akan menggantung selamanya. (Dan juga mencetak aliran pesan kesalahan.)
falsePockets