Joker karakterlerle istediğim dosyaların adını sürekli olarak filtreleyen "grep" yapabilir miyim?


40

Geçerli dizinde özyinelemeli grep araması yapmak istediğimde, genellikle yaparım:

grep -ir "string" .

Ancak bu komut, çok yavaş bir arama işlemine neden olan ikili dosyalar (resimler, ses, video, vb. Dahil) dahil olmak üzere her türlü dosyayı arar.

Bunu yaparsam, örneğin, çalışmıyor:

grep -ir "string" *.php

Çalışmıyor çünkü geçerli dizinde PHP dosyaları yok, fakat mevcut dizindeki bazı alt dizinlerin içinde ve alt dizinlerin adları ".php" ile bitmiyor, bu yüzden grep onların içine bakmıyor.

Peki, geçerli dizinden özyinelemeli bir arama nasıl yapabilirim ama aynı zamanda dosya adı joker karakterlerini de belirleyebilirim? (yani: yalnızca belirli bir uzantı ile biten dosyaları arayın)

Yanıtlar:


58

Kullanım grepbireyin --includeseçeneği:

grep -ir "string" --include="*.php" .

1
Tamam, görünüşe göre grep sürümüm eskiydi, çünkü bu seçeneğe sahip değildi (neden bunu nasıl yapacağımı çözemediğime şaşmamalı!). Mesajını aldım: "grep: unrecognized option` --include = *. Php '". Ama daha yeni birine yükselttim ve şimdi çalışıyor. Teşekkür ederim!
OMA

Sonunda süreyi değiştirmek ve kullanmak zorunda kaldım:grep -ir "string" --include="*.php" *
Stuart,

Ben sadece dönemin sıranın sonu olduğunu sanıyordum! Kullanmadım ya da ihtiyacım yoktu.
boardtc

14

Seçeneği grepolmayan bir sürüme --includesahipseniz, aşağıdakileri kullanabilirsiniz. Her ikisi de bunun gibi bir dizin yapısında test edildi:

$ tree
.
├── a
├── b
   └── foo2.php
├── c
   └── d
       └── e
           └── f
               └── g
                   └── h
                       └── foo.php
├── foo1.php
└── foo.php

Tüm .phpdosyaların dizeyi içerdiği yer string.

  1. kullanım find

    $ find . -name '*php' -exec grep -H string {} +
    ./b/foo2.php:string
    ./foo1.php:string
    ./c/d/e/f/g/h/foo.php:string

    açıklama

    Bu tüm .phpdosyaları bulur ve daha sonra grep -H stringher birinde çalışır. İle findbireyin -execseçenek, {}bulunan dosyaların her biri ile değiştirilir. -HSöyler grepdosya adını yanı sıra eşleşti çizgiyi basmak için.

  2. Yeterince yeni bir sürümünüz olduğunu varsayarak, şunları bashkullanın globstar:

    $ shopt -s globstar
    $ grep -H string  **/*php
    b/foo2.php:string
    c/d/e/f/g/h/foo.php:string
    foo1.php:string

    açıklama

    Bash kılavuzunda açıklandığı gibi :

    globstar

    Ayarlanırsa, dosya adı genişletme bağlamında kullanılan '**' deseni tüm dosyalar ve sıfır veya daha fazla dizin ve alt dizinle eşleşir. Deseni '/' izliyorsa, yalnızca dizinler ve alt dizinler eşleşir.

    Böylece, çalıştırarak , mevcut dizindeki tüm dosyalara genişleyen ( 0 veya daha fazla dizinle eşleşir , yani aynı zamanda eşleşir ) shopt -s globstarözelliğini ve Bash'in globstarseçeneğini etkinleştiriyorsunuz .**/*php.php****/*php./foo.phpstring


-2

kullanım */*.php

Bu grep aramasını bir seviye alt seviyeye getirir


Yıldızlar ve noktalar kaybolurken bir şeyler ters gitti.
Dennis Nolan

Kodu biçimlendirmek için backtick'leri kullanabilirsiniz ve markdown biçimlendirmesinde vurgu için yıldız işaretlerinin kullanımıyla ilgili belirsizliği önlemek için kullanabilirsiniz. Not: Not son paragrafta "özyinelemeli arama" hakkında soru sorar (benim olumsuz oyum değil).
RedGrittyBrick

Doğru bir cevap değil, çünkü sizin de belirttiğiniz gibi sadece bir seviye derin dizin yapıları için iyidir, fakat yine de bilmek iyidir;). Bunun için benim oyum.
OMA
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.