Menggunakan grep dengan flag --exclude-dir untuk mengecualikan beberapa direktori

15

Saya mencari melalui aplikasi Ruby on Rails untuk menggunakan kata greppada OSX, dan saya ingin mengecualikan direktori yang cocok dengan pola tertentu.

Saya menggunakan perintah berikut:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

Perintah ini tidak melakukan apa yang saya pikir akan dilakukan. Inilah cara saya berpikir itu akan berhasil:

  • i - case pencarian tidak sensitif
  • n - nomor baris cetak di mana pola ditemukan
  • R - cari secara rekursif
  • w - Saya hanya ingin seluruh kata - yaitu, cocokkan "langsung" tetapi bukan "direktori"
  • -E - gunakan ekspresi reguler yang diperluas
  • 'direct' - ungkapan reguler yang ingin saya cocokkan
  • . - cari di direktori saat ini
  • --exclude-dir -E 'git | log | asset' - mengecualikan direktori yang cocok dengan git atau log atau aset.

Dalam hal direktori yang dikecualikan, perintah tersebut akhirnya akan mencari di direktori './git' dan './log' , juga di './app/assets'

Saya jelas tidak memiliki pengetahuan mendasar, tetapi saya tidak tahu apa itu.

Steven L.
sumber

Jawaban:

16

Deskripsi halaman manual untuk opsi itu agak menyesatkan ... Polanya seperti dalam gumpalan, bukan pola seperti pada regex . Per infohalaman :

--exclude-dir = GLOB

Lewati direktori baris perintah dengan akhiran nama yang cocok dengan pola GLOB. Saat mencari secara rekursif, lewati setiap subdirektori yang nama dasarnya cocok dengan GLOB. Abaikan sembarang garis miring trailing yang berlebihan di GLOB.

Jadi, dalam kasus Anda, Anda dapat menjalankan:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

untuk mengecualikan direktori bernama git, logdan assetsatau misalnya

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

untuk mengecualikan nama direktori yang diakhiri gitatau dimulai dengan asset.

don_crissti
sumber
Sangat menarik. Kurasa aku harus mencari tahu apa itu gumpalan.
Steven L.
Maaf, tapi tidak ada yang berhasil. Apakah akan membantu jika saya mengatakan bahwa saya menggunakan versi grep: grep (BSD grep) 2.5.1-FreeBSD?
Steven L.
Saya bingung karena saya membaca manual untuk bsd grep ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) dan tidak disebutkan --exclude-dir. Boo.
Steven L.
2
OK - saya melihat masalahnya sekarang. Ini harus merupakan versi modifikasi dari grep yang hanya digunakan oleh sistem Apple. Saya menggunakan Mac OS X. Saya minta maaf atas kebingungan di sini. Saya yakin ada forum di tempat lain di stackexchange yang bisa saya posting.
Steven L.
@ user245185 apakah Anda menggunakan BSD atau OSX? Keduanya pada topik di sini, tetapi harap edit pertanyaan Anda dan beri tahu kami OS apa yang Anda gunakan. Perilaku alat standar berbeda antara implementasi saat Anda menemukan.
terdon
8

--exclude-dirtidak mengerti |.

Namun, Anda bisa mendapatkan efek yang sama dengan menentukan --exclude-dirbeberapa kali, satu untuk setiap direktori yang ingin Anda kecualikan:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
John1024
sumber
Ini berhasil untuk saya. Saya ingin mengecualikan direktori home tetapi tidak berfungsi dengan opsi lain seperti --exclude-dir={home}. Saya bekerja ketika saya mengetik--exclude-dir 'home'
Mubin Icyer