Find (1) ve grep (1) komutlarını kullanarak belirli bir dize içeren dosyaları bulma


70

find . -type f -print -exec cat {} \; | grep some string

Yukarıdaki komut dosya yolunu yazdırmıyor.

Ben kullanıyorum: Ubuntu, bash 4.


Belki de grep filtresi nedeniyle beklenen sonuçlarınızı karşılamıyordur. Peki ya bu:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex

Ulaşmak istediğiniz hedef nedir? Çıktıda dosyalardan grepped dizeleri alıyorsunuz, bu dosyaların yolunu mu istiyorsunuz?
mirkobrankovic

Evet, 'some string' dizesini içeren dosyaların yolunu yazdırmak istiyorum. @ artistoex önerisi tüm dosya yollarını basar.
H.Rabiee

ackGeçerli dizinin altındaki tüm dosyaları taramak, muhtemelen yalnızca belirli dosya türlerini filtrelemek için kullanmak isteyebilirsiniz .
Jaap Eldering

Yanıtlar:


87

Bunun nedeni grep, dosya adlarını içeren bir metin akışını beslemenizdir . Grep için herhangi bir dosya adı belirtmediğiniz için, eşleşen bir satırın hangi dosyadan geldiğini çözmeniz beklenemez. Kullanım xargs:

find . -type f -print | xargs grep "some string"

GNU find / xargs'a sahip olduğunuzdan, xargs'ın dosya isimlerini okuması için daha güvenli bir yoldur:

find . -type f -print0 | xargs -0 grep "some string"

Eşleşen çizgiye sahip dosya isimlerini sadece eşleşen çizgiyi göstermeden istiyorsan:

find . -type f -print0 | xargs -0 grep -l "some string"

Yukarıdaki komutları arama ve değiştirme ile nasıl birleştiririm? Gibi, grep sonra sed?
CMCDragonkai

1
find | grep sed '...' $(find ... | xargs grep -l ...)
pipeeline

107

kullanırım

grep "some string" . -R

ve daha hızlı çalışıyor

ps

Daha karmaşık kullanım durumu

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

Param okumak i açıklama

grep --help | grep -- -i

17
Ve -nsatır numaralarını istiyorsanız. Basitleştirilmiş cevap için +1.
Chad Skeeters,

@ChadSkeeters tam olarak. Kullanılması find böyle bir çözüm sağlamaz.
ArcherGodson

1
Dürüst olmak gerekirse, bu doğru cevap olarak işaretlenmelidir. Şu anda seçilen bir detay tamamen başka bir şeyi detaylandırıyor.

11

Genellikle karmaşık klasör yapılarında kaynak kodu ararım ve aşağıdakileri kullanarak yararlı buluyorum:

cd /your/folder/
grep -rHino "your string"

Bu parametrelerle, find kullanmadan , dosyanın tam yolunu ve belirtilen dizeyi içeren satır numarasını ediniyorum .

Ayrıca bir rHino gibi aramanızla BASH esası nedeniyle hatırlamak kolaydır. :)

Bunun nasıl hızlı bir örnekle işe yaradığını göstereceğim.

Cat kullanarak bir dosyanın içeriğini görüntüleyelim:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Ve şimdi "iptables -P" dizesini içeren tüm dosyaları tekrarlı olarak arayalım:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Çıktıda görebileceğiniz gibi dosya adımız var: hit row: searched string

İşte kullanılan parametrelerin daha ayrıntılı bir açıklaması:

-r Her bir dizin işleneni için, bu dizindeki tüm dosyaları tekrar tekrar okuyun ve işleyin. Komut satırındaki sembolik bağları izleyin, ancak yinelemeli olarak karşılaşılan sembolik bağları atlayın. Dosya işlenen belirtilmezse, grep çalışma dizinini arar. Bu, '--directories = recurse' seçeneğiyle aynıdır.

-I Her eşleşme için dosya adını yazdırın. Aramak için birden fazla dosya olduğunda bu varsayılandır.

-n Her çıktı satırını, girdi dosyasında 1 tabanlı satır numarasıyla önekleyin. (-n POSIX tarafından belirtilmiştir.)

-H Her eşleşme için dosya adını yazdırın. Aramak için birden fazla dosya olduğunda bu varsayılandır.

-o Eşleşen çizgilerin yalnızca eşleşen (boş olmayan) kısımlarını, bu kısımların her biri ayrı bir çıktı satırında yazdırın. Çıkış satırları girişle aynı sınırlayıcıları kullanır ve -z (--null-data) da kullanılıyorsa sınırlayıcılar boş bayt'tır (bkz. Diğer Seçenekler).


1

tercih ederim

| dosya bul | make grep ont dosya bul | dosyanın tam yolunu göster

/ -type f -exec grep 'bazı dizeleri' {} \; -exec echo {} \;


0

Silver Searcher , dosya ve içerik aramak için çok hızlı ve kullanışlı bir kullanımdır.

Sorununuzu çözmek için gümüş arama komutu şöyle görünür ...

ag 'some string' -l

-l Yalnızca eşleşen içeren dosya adlarını yazdır (eşleşen satırları yazdırmayın)

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.