Karmaşık bir arama için bulma ve grep nasıl birleştirilir? (GNU / linux, bul, grep)


17

Benzer bir dizin yapısını paylaşan ancak GNU / Linux'ta aynı dizin ağacında olmayan bazı dosyalarda metin araması yapmaya çalışıyorum.

Ben aynı ağaç yapısını (Code Igniter MVC PHP framework) paylaşan birçok site ile bir web sunucusu var, bu yüzden her site için ağaç aşağı belirli bir dizinde aramak istiyorum, örnek:

/srv/www/*/htdocs/system/application/

Burada * site adıdır. Ve bu uygulama dizinlerinden, tüm ağacı yapraklarına kadar aramak istiyorum, içinde bazı metin desenleri olan bir * .php dosyası için, "debug (", diyelim ki düzenli ifade gerekli değil).

Bul ve grep'i nasıl kullanacağımı biliyorum ama onları birleştirmede iyi değilim.

Bunu nasıl yaparım?
Şimdiden teşekkürler!

Yanıtlar:


21

Deneyin

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

Bu, altındaki klasörleri uzantıya applicationsahip dosyalar için özyinelemeli olarak aramalı .phpve bu dosyalara iletmelidir grep.

Bu konuda bir optimizasyon:

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

Bu, xargstüm .phpdosyaları çıktı findolarak argümanlar olarak tek bir grepkomuta iletmek için kullanılır ; ör . Seçeneği ve seçenek dosya ve dizin adlarında boşluk sağlamak doğru şekilde işlenir. Aktarılan seçenek , dosya adının her durumda yazdırılmasını sağlar. (Varsayılan olarak, çoklu argümanlar geçirilen yalnızca dosya adını yazdırır.)grep "debug (" file1 file2 file3-print0find-0xargs-Hgrepgrep

Adam xargs Gönderen:

-0

      Giriş öğeleri boşluk yerine boş karakterle sonlandırılır ve tırnak işaretleri ve ters eğik çizgi özel değildir (her karakter tam anlamıyla alınır). Başka bir bağımsız değişken gibi ele alınan dosya dizesinin sonunu devre dışı bırakır. Giriş öğeleri beyaz boşluk, tırnak işaretleri veya ters eğik çizgiler içerdiğinde kullanışlıdır. GNU bulma -print0seçeneği bu mod için uygun girdi üretir.


1
+1. Ancak, her php dosyası için grep yürütür. Çok sayıda dosya varsa daha fazla optimize edebilirsinizfind /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep "debug ("
Jukka Matilainen 24:09

@jackem Kabul etti. Cevabımı buna göre güncelleyeceğim.

2
Başka bir küçük gelişme: xargs sadece bir dosya adını grep'e aktarabilir, bu durumda grep bir eşleşme varsa dosya adını göstermez. Dosya adını göstermeye zorlamak için grep komutuna -H eklemek isteyebilirsiniz.
Randy Orrison

@Randy Bu çok geçerli bir nokta.

3
Bu gerçek bir büyücülüktür, ancak aynı tür tek işlem yürütme yerine operatörü GNU findalabilir . Bu nedenle, bu yanıttaki örnekle aynı şeyi yapar , ancak daha az bir işlem çatalı (ve yine de dosya adı sorunları için 0 risk). +\;xargsfind /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep -H "debug (" {} +xargs
Daniel Andersson

10

findbu örnek için bile gerekli değilse, grepdoğrudan kullanılabilir (en azından GNU grep):

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

ve biz tek bir işlem çatalı aşağı.

Seçenekler:

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

Sadece merak için, -RHseçenekler ne anlama geliyor?
Gus

@Gus: Gönderiye man grepseçenek açıklamalarından alıntı eklendi .
Daniel Andersson

0

Kabuğunuz php dosyalarını bulabilir ve grep'e verebilir. Bash'da:

shopt -s nullglob globstar
grep searchterm /srv/www/*/htdocs/system/application/**/*.php
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.