Birden çok dizini hariç tutmak için --exclude-dir bayrağıyla grep kullanma


17

Bir Ruby on Rails uygulaması grepüzerinden OSX üzerinde bir sözcük için arama yapıyorum ve belirli bir desenle eşleşen dizinleri hariç tutmak istiyorum.

Aşağıdaki komutu kullanıyorum:

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

Bu komut, yapacağını düşündüğüm şeyi yapmıyor. İşte nasıl olacağını düşündüm :

  • i - büyük / küçük harfe duyarlı olmayan arama
  • n - desenin bulunduğu satır numarasını yazdır
  • R - özyinelemeli arama
  • w - Sadece tüm kelimeleri istiyorum - yani "doğrudan" ile eşleşir, "dizin" ile eşleşmez
  • -E - genişletilmiş düzenli ifade kullan
  • 'direct' - eşleştirmek istediğim normal ifade
  • . - geçerli dizinde arama
  • --exclude-dir -E 'git | log | asset' - git veya log veya öğeyle eşleşen dizinleri hariç tutar.

Hariç tutma dizinleri açısından, komut yine de './git' ve './log' dizinlerinde ve './app/assets' dizinlerinde arama yapar

Açıkçası temel bir bilgi eksikliğim var, ama bunun ne olduğunu bilmiyorum.

Yanıtlar:


17

Bu seçenek için man sayfası açıklaması bir tür yanıltıcıdır ... Globlarda olduğu gibi normal ifadede olduğu gibi desen değildir . Başına infosayfa :

--exclude-dir = GLOB

GLOB deseniyle eşleşen bir ad sonekine sahip tüm komut satırı dizinlerini atlayın. Özyinelemeli arama yaparken, temel adı GLOB ile eşleşen tüm alt dizinleri atlayın. GLOB'daki gereksiz sondaki eğik çizgileri yoksayın.

Yani, sizin durumunuzda:

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

isimli dizinleri dışlamak için git, logve assetsya mesela

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

ile biten gitveya ile başlayan dizin adlarını hariç tutmak için asset.


Çok ilginç. Sanırım bir kürenin ne olduğuna bakmalıyım.
Steven L.

Üzgünüm ama bunların hiçbiri çalışmıyor gibi görünüyor. Bu grep: grep (BSD grep) 2.5.1-FreeBSD sürümünü kullandığımı söylersem yardımcı olur muydu?
Steven L.

Ben bsd grep ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) kılavuzunu okuduğum için üzüldüm ve --exclude-dir'den bahsedilmiyor. Boo.
Steven L.

2
Tamam - sorunu şimdi görüyorum. Bu, yalnızca Apple sistemi tarafından kullanılan grep'in değiştirilmiş bir sürümü olmalıdır. Mac OS X kullanıyorum. Buradaki karışıklık için özür dilerim. Eminim stackexchange üzerinde gönderebileceğim başka bir forum var.
Steven L.

@ user245185 BSD veya OSX'te misiniz? Her ikisi de burada konuyla ilgili, ancak lütfen sorunuzu düzenleyin ve hangi işletim sistemini kullandığınızı bize bildirin. Standart araçların davranışları, keşfettiğiniz uygulamalar arasında farklılık gösterir.
terdon

8

--exclude-diranlamıyor |.

Bununla birlikte, --exclude-dirhariç tutmak istediğiniz her dizin için bir defa olmak üzere birden çok kez belirterek aynı etkiyi elde edebilirsiniz :

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

Benim için çalıştı. Ana dizini hariç tutmak istedim ama diğer seçeneklerle çalışmadı --exclude-dir={home}. Ben yazarken çalıştım--exclude-dir 'home'
Mubin Icyer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.