it-swarm-tr.com

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

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

Denedim:

grep -r 800x600 /

ama işe yaramıyor.

Komutumun yapması gerektiğine inandığım, "800x600" metni için kök altındaki tüm dosyalar/klasörler aracılığıyla tekrar tekrar grep ve arama sonuçlarını listelemek.

Neyi yanlış yapıyorum?

56
Level1Coder

Normalde grep birkaç dosya üzerinde çalıştırmak için bu komut stilini kullanın:

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

Bunun gerçekte yaptığı, sistemdeki her dosyanın bir listesini yapmak ve daha sonra her dosya için verilen değişkenlerle ve her dosyanın adıyla grep dosyasını yürütün.

-xdev Argümanı, diğer dosya sistemlerini yoksayması gerektiğini söyler - bu, /proc Gibi özel dosya sistemlerinden kaçınmak için iyidir. Bununla birlikte, normal dosya sistemlerini de yok sayar - bu nedenle, örneğin,/home klasörünüz farklı bir bölümdeyse, aranmaz - find / /home -xdev ... Demeniz gerekir.

-type f Yalnızca dosyaları aramak anlamına gelir, bu nedenle dizinler, cihazlar ve diğer özel dosyalar yok sayılır (yine de dizinlere geri çekilir ve içindeki dosyalar üzerinde grep yürütülür - sadece dizinin kendisinde grep yürütülmez yine de işe yaramaz). grep için -H Seçeneği, dosyaya her zaman çıktısında dosya adını yazdırmasını söyler.

find, dosya 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 -2M, 2 megabayttan küçük dosyalar anlamına gelir. -mtime -5 Son beş gün içinde değiştirilen dosyalar anlamına gelir. Bunları ve ve -o ile veya için bir araya getirin ve ifadeleri gruplandırmak için '(' Parantezini ')' Kullanın Kabuğun bunları yorumlamasını önleyin). Yani mesela:

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

Olası filtrelerin tam listesini görmek için man find Sayfasına bakın.

68
Richard Downer

Normalde sistemde HER ŞEY'i 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 İlk sabit sürücünüz için fiziksel blok cihazıdır. Büyük olasılıkla bağlı disk sistemlerinde değil, ham disk aygıtında arama yapmak istersiniz. Ayrıca, her okuduğunuzda rastgele verileri veren /dev/random Vardır. Bunu aramak pek mantıklı değil. /proc Dosya sistemi sizin durumunuzda da sorunludur.

İki şeyden birini tavsiye ederim.

  1. Kökte arama yapmayın, yalnızca yararlı olabilecek yerleri arayın. /home Veya /usr Veya /etc Öğelerini ayrı ayrı arayın. Aradığınız bilgi muhtemelen belirli bir türdendir, bu nedenle yine de belirli bir klasörde olabilir. Yapılandırma ayarları /etc İçinde olmalıdır. Kişisel veri dosyalarınız /home İçinde olmalıdır. Aramayı böyle büyük bir alanla sınırlamak, yinelemeli grepslerle ilgili sorunlarınızı büyük ölçüde azaltacaktır.

  2. --exclude-dir Kullanarak sorunlu alanları ve buna ihtiyacınız olmadığını 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 grep yaparken birkaç 'izin reddedildi' hatasıyla karşılaşmak nadir değildir. Normal kullanım sırasında, kullanıcınızın okuyamayabileceği dosyalar vardır. Bunlar sadece birkaç garip dosya olduğu ve sabit sürücüleriniz veya tüm proc dosya sistemi için ham cihaz gibi şeyler olmadığı sürece, hataları görmezden gelmek iyidir. Aslında bunu tüm hataları asla karaya göndermeyerek komut satırında yapabilirsiniz:

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

Sadelik için ack-grep öneririm. ack-grep daha iyi bir seçenektir.

Kullanmak için, kurulumdan sonra:

ack-grep pattern /
3
bbaja42

Ona bakmanın başka bir yolu da şu şekildedir:

grep -r /* | grep "800x600"
2
maniat1k

* sonra/proc/sysrq-trigger alıyorum: Giriş/çıkış hatası

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

İle sistem dizinlerini hariç tutmanızı tavsiye ederim

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

0
Koffee