Kayıt için, tercih ettiğim yaklaşım:
grep pattern $(find . -type f ! -path './test/main.cpp')
grepKomutun başında tutarak, bunun biraz daha açık olduğunu düşünüyorum - artı greprenk vurgulamasını devre dışı bırakmıyor . Bir anlamda, findbir komut ikamesinde kullanmak, grepişlevlerinin (sınırlı) dosya arama alt kümesini genişletmenin / değiştirmenin bir yoludur .
Bana göre find -execsözdizimi bir çeşit sırtır. Bir karmaşıklık find -exec(bazen) çeşitli karakterlerden kaçma gereksinimidir (özellikle \;Bash altında kullanılıyorsa). Sadece şeyleri tanıdık bağlamlara koymak için, aşağıdaki iki komut temel olarak eşdeğerdir:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
Alt dizinleri hariç tutmak istiyorsanız , joker karakter kullanmak gerekebilir. Buradaki şemayı tam olarak anlamıyorum - gizli hakkında konuşun :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
Komut dosyalarında kullanılmak üzere genelleştirilmiş findçözümleri genelleştirmek için başka bir not : grepKomut satırı -H/ --with-filenameseçeneğini içermelidir . Aksi takdirde, arama sonuçlarında yalnızca bir dosya adı olması durumunda çıktı biçimlendirmesini değiştirir find. Bu, dikkate değerdir çünkü grepyerel dosya araması ( -rseçenekle birlikte) kullanılıyorsa gerekli görünmemektedir .
... Daha da iyisi, aranacak /dev/nullilk dosya olarak dahil etmektir. Bu iki sorunu çözer:
- Aranacak bir dosya varsa, iki dosya olduğunu
grepdüşünecek ve çoklu dosya çıktı modunu kullanacaktır.
- Aranacak
grepdosya yoksa, tek bir dosya olduğunu düşünecek ve stdin'de beklemeyecek.
Yani son cevap:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir) hariç tutmak istersem sorun büyütülür . Bu yüzden grep'in dışlamayı yerel olarak gerçekleştirmesini istiyorum.