Kayıt için, tercih ettiğim yaklaşım:
grep pattern $(find . -type f ! -path './test/main.cpp')
grep
Komutun başında tutarak, bunun biraz daha açık olduğunu düşünüyorum - artı grep
renk vurgulamasını devre dışı bırakmıyor . Bir anlamda, find
bir komut ikamesinde kullanmak, grep
işlevlerinin (sınırlı) dosya arama alt kümesini genişletmenin / değiştirmenin bir yoludur .
Bana göre find -exec
sö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 : grep
Komut satırı -H
/ --with-filename
seç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ü grep
yerel dosya araması ( -r
seçenekle birlikte) kullanılıyorsa gerekli görünmemektedir .
... Daha da iyisi, aranacak /dev/null
ilk dosya olarak dahil etmektir. Bu iki sorunu çözer:
- Aranacak bir dosya varsa, iki dosya olduğunu
grep
düşünecek ve çoklu dosya çıktı modunu kullanacaktır.
- Aranacak
grep
dosya 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.