Bir içerik için bütün ağacı aramak istediğimde, kullanıyorum
find . -type f -print0 | xargs -0 grep <search_string>
Bunu performans veya kısalık olarak yapmanın daha iyi bir yolu var mı?
Bir içerik için bütün ağacı aramak istediğimde, kullanıyorum
find . -type f -print0 | xargs -0 grep <search_string>
Bunu performans veya kısalık olarak yapmanın daha iyi bir yolu var mı?
Yanıtlar:
Eğer kontrol edin grep
destekleri -r
(seçeneği recurse ):
grep -r <search_string> .
--exclude-dir
performansını ele almak için bir yorum ekle ve biz bir kazanan var!
grep
son zamanlarda FreeBSD ve Linux dağıtımlarını destekliyor. Ve neden --exclude-dir
? Bütün bir ağacı aramak istemedin mi?
--exclude-dir
kullanım durumumda aslında kullanışlıdır (çünkü alt ağacın bölümleri büyük, fakat işe yaramaz) ve performans hakkında sorular sordum ... ama haklısın, bu gerekli değil.
--exclude-dir
özel olduğunu eklemeliyim grep
. (-:
Bir alt optimal cevap: Bunun yerine boruları koymak find
içinegrep
sadece koşabilirsiniz
find . -type f -exec grep 'research' {} '+'
ve voila, iki yerine bir komut!
açıklama:
find . -type f
içindeki tüm düzenli dosyaları bulun.
-exec grep 'research'
grep 'araştırma'
{}
bulunan dosya adı
'+'
her dosya adı için bir komut kullanın, dosya adı başına bir kere değil.
Nb: ile ';'
dosya adı başına bir kez olurdu.
Bunun dışında, eğer kaynak kodu işlemek için kullanırsanız, içine bakabilirsiniz. ack
kod bitlerini kolayca aramak için yapılmış .
Düzenle :
Bu araştırmayı biraz uzatabilirsiniz. İlk önce,-name ''
anahtarını .find
specifig adlandırma desenli dosyalar için bakmak için.
Örneğin :
yalnızca günlüklere karşılık gelen dosyalar: -name '*.log'
yalnızca c başlıklarına karşılık gelen dosyalar, ancak dosya adı uzantılarınız için büyük veya küçük harflerle yapışamazsınız: -iname *.c
Nb: gibi grep
ve ack
, -i
anahtarı bu durumda duyarsız durumda anlamına gelir.
Bu durumda, grep renksiz ve satır numarasız olarak gösterilir.
Bunu --color
ve -n
düğmeleriyle değiştirebilirsiniz (sırasıyla dosyalarda Renkli ve satır numaraları).
Sonunda, şöyle bir şey olabilir:
find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'
Örneğin
$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+'
./test2/target.c:1:hello
-name '*.log'
daha hızlı olduğu gibi filtre ile tercih ederim .
Alt dizinlere tekrar girmek istiyorsanız:
grep -R 'pattern' .
Bu -R
seçenek standart bir seçenek değildir, ancak en yaygın grep
uygulamalar tarafından desteklenir .
-r
-R
grep
uygulamaları özyinelemeler yakalasa da bence. Aksi halde "ağaç" ile ne demek istediğine bağlı.
grep
yapmak gibi bir aletin yapması gereken bir şey değildir . Kullanıcı, dizin yapısında sembolik bağlantı döngüler varsa, evet, bu :-) kullanıcının problem
/sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...
(-XI gibi araçlar bana bakıcılık yapıyor (garip sihir sağlamazlarsa "AI" diyorlar) (-;
Yukarıda belirtildiği gibi -r
veya-R
(istenen sembolik bağlantıya bağlı olarak) hızlı bir seçenektir.
ancak -d <action>
, zaman zaman yararlı olabilir.
Güzel olan şey -d
, sadece geçerli seviyeyi taramak istediğinizde "grep: directory_name: Bir dizin" sesini susturan, atlama komutudur.
$ grep foo *
grep: q2: Is a directory
grep: rt: Is a directory
$ grep -d skip foo *
$
ve tabi ki:
$ grep -d recurse foo *
(list of results that don't exist because the word foo isn't in our source code
and I wouldn't publish it anyway).
$
Bu -d skip
seçenek, başka bir komut dosyasında GERÇEKTEN kullanışlı olduğundan, mecbur kalmanıza gerek yok 2> /dev/null
. :)
Çok fazla dosyayla uğraşıyorsanız, grep tüm dosyaları alt klasörlerde greplemekten ziyade, araması gereken dosyaları budadığınızda daha hızlı çalışır.
Bazen bu formatı kullanıyorum:
grep "primary" `find . | grep cpp$`
Alt klasörlerine tüm dosyaları bul .
o sonundacpp
. Sonra "birincil" için bu dosyaları grep.
İsterseniz, bu sonuçları başka bir görüşme çağrısına aktarmaya devam edebilirsiniz:
grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"