Tüm dosya sisteminde metin nasıl aranır?


53

Grep aracının kullanılması gerektiğini varsayarak, tüm dosya sistemi boyunca "800x600" metin dizesini aramak istiyorum.

Denedim:

grep -r 800x600 /

ama işe yaramadı.

Komutumun yapması gerektiğine inandığım şey, "800x600" metni için kök altındaki tüm dosyalar / klasörler arasında tekrar tekrar gezinerek arama sonuçlarını listelemektir.

Neyi yanlış yapıyorum?


2
Ve "işe yaramaz" derken tam olarak ne demek istiyorsun? Herhangi bir çıktı almıyor, kilitleniyor veya çok fazla Permission deniedhata yazdırıyor mu? Kök veya normal bir kullanıcı olarak mı çalıştırdınız?
alex,

Bazı çekişler alıyorum, her şeyden önce komutları çalıştırmaya çalışırken kullanıcı giriş dizinimdeydim. Yani şimdi kök / kök cd. Daha sonra yukarıdakiyle aynı komutu denedim ve birçok izin reddedildi hataları alıyorum. Tamam, şimdi sudo grep -r 800x600 / 'ı denemeye çalışıyorum ve ardından a / proc / sysrq-trigger alıyorum: Giriş / çıkış hatası
Level1Coder

Neden işe yaramayacağını bilmiyorum. Yaparak erişim hatalarını yok sayabilirsiniz grep -r 800x600 / 2>/dev/null. Ayrıca root olarak çalıştırmayı deneyebilirsiniz.
Totor

Yanıtlar:


64

Normalde bu komut tarzını grepbirkaç dosya üzerinden çalıştırmak için kullanırım :

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

Bunun gerçekte yaptığı şey, sistemdeki her dosyanın bir listesini yapmak ve sonra her dosya grepiçin verilen argümanlarla ve her dosyanın adını kullanarak yürütmek .

-xdevArgüman diğer dosya sistemlerini görmezden gerektiğini bulmak söyler - Bu gibi özel dosya sistemlerini kaçınmak için iyidir /proc. Bununla birlikte, normal dosya sistemlerini de görmezden gelir - örneğin, / home klasörünüz farklı bir bölümdeyse, aranmaz - söylemeniz gerekir find / /home -xdev ....

-type fsadece dosya aramak anlamına gelir, böylece dizinler, aygıtlar ve diğer özel dosyalar göz ardı edilir (yine de dizinlere tekrar girer ve grepiçindeki dosyalarda çalışır - sadece grepdizinde çalışmaz, yine de çalışmaz). Ve dosya adını her zaman çıktısında yazdırmasını söyleme -Hseçeneği grep.

findDosya listesini filtrelemek için her türlü seçeneği kabul eder. Örneğin, -name '*.txt'yalnızca .txt ile biten dosyaları işler. -size -2M2 megabayttan daha küçük dosyalar anlamına gelir. -mtime -5Son beş günde değiştirilen dosyalar anlamına gelir. Bunları -a için ve ve -o ile veya ile birlikte birleştirin ve ifadeleri gruplamak için '('parantez ')'kullanın (kabuğun bunları yorumlamasını önlemek için tırnak içine alın). Yani örneğin:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

man findOlası filtrelerin tam listesini görmek için göz atın .


2
Not -xdevhariç tutar tüm diğer dosya sistemlerini değil, sadece özel olanları. (örneğin, /homeayrı bir bölüm olarak monte ettiyseniz,
aranmaz

Her birini çalıştırmayı denedim ama her ikisi de bir hata find: paths must precede expression: /
döndürdü

1
Not: Düzenli ifadeler gerekli olmadığında 'fgrep', 'grep' öğesinden önemli ölçüde daha hızlıdır; bu, büyük bir ağaç ararken büyük bir fark yaratacaktır.
Nathan Kidd

1
xargsYaparak daha iyi verimlilik elde etmekten kaçınabilirsiniz find / -xdev -type f -exec grep -H '800x600' +.
Totor

3
Hayır, komutun +sonundaki işaret findaslında aynı şeyi yapar xargs: bir grepsüreci birkaç argümanla ortaya çıkarır .
Totor

14

Normalde aslında sistemdeki HER ŞEYİ aramak istemezsiniz. Linux her şey için dosya düğümleri kullanır, bu nedenle bazı "dosyalar" aramak istediğiniz şeyler değildir. Örneğin /dev/sda, ilk sabit sürücünüz için fiziksel blok aygıtı. Muhtemelen ham disk aygıtı yerine takılı dosya sistemlerini aramak istersiniz. Ayrıca, /dev/randomher okuduğunuzda rastgele veriyi dağıtan var. Bunu aramak çok mantıklı değil. /procDosya sistemi de senin durumunda problemlidir.

İki şeyden birini tavsiye ederim.

  1. Kökte arama yapmayın, yalnızca yararlı olabilecek yerleri arayın. Ara /homeveya /usrveya /etcayrı ayrı. Aradığınız bilgi belirli bir tür olabilir, bu nedenle yine de belirli bir klasörde olması muhtemeldir. Yapılandırma ayarları içeride olmalıdır /etc. Kişisel veri dosyalarınız içeride olmalıdır /home. Aramayı bu gibi büyük bir alanda sınırlandırmak, özyinelemeli greplerle ilgili problemlerinizi büyük ölçüde azaltacaktır.

  2. Sorunlu alanları --exclude-dirve buna ihtiyaç duymadığınızı bildiğiniz bir dizi şeyi hariç tutun:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

Son olarak, büyük bir özyinelemeli bir grep yaparken birkaç 'izin reddedilen' hatayla karşılaşmak nadir değildir. Normal kullanım sırasında, kullanıcının okuyamayabileceği dosyalar vardır. Bunlar sadece birkaç tuhaf dosya olduğu ve sabit diskleriniz için ham aygıt ya da tüm proc dosya sistemi gibi şeyler olmadığı sürece, hataları göz ardı etmek yeterlidir. Aslında bunu komut satırında tüm hataları asla karaya göndermeyerek yapabilirsiniz:

grep -r search_string /path 2> /dev/null

3
-Iikiliyi hariç tutacak
Rahul Patil

2

Basit olması için ack-grep öneririm . Bağlantı, ack-grepdaha iyi bir seçenek olduğunda birçok durumu gösterir .

Kullanmak için, kurulumdan sonra:

ack-grep pattern /

Bunu önerdiğin için teşekkürler, ama bunu koştum ve bana gerçekten beklediğim arama sonuçlarını vermedi. İstediğimi elde etmek için birçok ayarda ince ayar yapmam gerekecek gibi görünüyor. Şu an itibariyle Richard'ın cevabı kutudan çıkıyor. Gelecekte de bu yararlı göründüğü gibi bakacağız.
Level1Coder

1

Ona bakmanın başka bir yolu da budur:

grep -r /* | grep "800x600"

0

* sonra bir / proc / sysrq-trigger alıyorum: Girdi / çıktı hatası

Komutunuz çalışıyor ve bir dize için çalışan işlemleri taramaya çalıştığınız için bu hatayı alıyorsunuz.

Sistem dizinlerini hariç tutmanızı öneririm

grep -exclude-dir = {proc, sys} "800x600" /


-3

basitçe doğru

grep -r "800x600" /

- Şu anki komutunuzda yanlış olan tırnak işaretleri "". Dize bağımsız değişkenini her zaman greptırnak içine alın.


3
Buradaki sorun bu değil. Bu özel argüman türünü verirken alıntılara ihtiyacınız yoktur grep. Deneyin ve göreceksiniz. "800x600" dizgisini bir dosyaya koyun ve sonra grep 800x600 filedüzgün çalıştığını göreceksiniz. OP'nin başka bir sorunu olduğu açık.
slm
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.