Grep, metin için TÜM klasörlerde arama yapmak için nasıl kullanılır?


0

Bir kerede TÜM dizinleri aramakta sorun yaşıyorum grep. Komutu kullandığımda:

find . -name "*.txt" | xargs grep texthere

Sadece sonsuza kadar sürer ve sonra bana "böyle bir dosya veya dizin yok" hataları verir.

Bu neden oluyor ve bundan daha kolay bir şey yok grepmu? Yoksa yanlış komut mu kullanıyorum?

Yanıtlar:


1

GNU grep'iniz varsa, grep, @Ouroborus tarafından önerildiği gibi, tekrarlı arama yapmak için "-r" seçeneğini destekler.

Ne yazık ki grep'iniz böyle bir seçeneği desteklemiyorsa, SunOS'ta olduğu gibi, bunun yerine aşağıdaki komutları kullanabilirsiniz:

find . -name "*.txt" -exec grep -n your_pattern {} /dev/null \;

/dev/nullHer grep işleminin, aranan dosyaların adını yazdırması için sağlanan iki dosyaya (eşleşen dosya * .txt ve / dev / null) sahip olmasını sağlamak için eklenir. Ve kapsamını daraltmak için -type fseçenek ekleyebilirsiniz .findfind


Her dosya için bir kez çağrıldığından beri bu daha yavaş olmaz mıydı grep?
Kusalananda

0

Olduğu gibi bu cevap , sen ile muhtemelen daha çok işinize:

grep -rnw '/path/to/somewhere/' -e "pattern"

  • -rveya -Rözyinelemeli,
  • -n satır numarası ve
  • -w tüm kelime ile eşleşiyor.
  • -l (küçük harf L) sadece eşleşen dosyaların adını vermek için eklenebilir.

0

İzinlerle ilgili hatalar alıyorsanız (siz söylemezsiniz), o zaman sanırım kök dizinde ( /) ya da tüm dosyaları okuma izninizin olmadığı bir yolda durduğunuzu , içinde /etcveya içinde olduğu gibi /var. Ama çok uzun sürdüğünü söylediğinden beri, ilk varsayıma (kök dizin) daha fazla eğildim.

Tüm sistemdeki tüm dosyaları kesinlikle aramak istiyorsanız, yaptığınız işlemden çok daha doğru. Bu olacak olursa ne yapmak uzun bir zaman alabilir. Aramanız gereken çok fazla dosya var.

findBakılacak dosya miktarını daraltmak için kullanabilirsiniz .

Şu anda, var

$ find . -name "*.txt" | xargs grep texthere

Yalnızca düz metin dosyalarıyla ilgilendiğiniz görülüyor olduğundan, diğer tüm dosya türlerini (çalıştırılabilir) hariç tutabiliriz:

$ find / -type f \! -perm -o=x -name "*.txt" | xargs grep texthere

Ben yerini .ile /ben nerede çünkü, burada düşünmek sen (yanılıyorsam beni düzeltin) bulunmaktadır. Ben de istediğini belirterek ediyorum dosyaları ( -type fvardır) çalıştırılabilir değil ( \! -perm -o=x() !Kabuk onunla komik şeyler yapmaz, böylece ihtiyaçları kaçtı edilecek).

Şimdi yapabileceğimiz birkaç şey daha var. Bir emniyet şeydir ve diğer edebilir muhtemelen hızını bir nebze iyileştirmek.

Bazı dosya isimlerinde boşluklar veya genellikle dosya isimlerinde istemediğimiz diğer tuhaf karakterler olabilir. Arasında doğru bu geçiş yapabilmek findve grepyaptığımız

$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 grep texthere

Bu ( -print0), her dosya adının bir boşluk karakteri yerine bir nulkarakter ( \0) ile sınırlandırılacağı anlamına gelir . Ve xargsbu nulayrılmış dosya adlarını almak için karşılık gelen seçenek -0.

Çünkü bu iki seçeneği kullanmıyorsunuz, "böyle bir dosya veya dizin yok" hatası aldığınıza inanıyorum.

Hız olan şey fgrep. Bu, grep -Farama dizenizde düzenli ifade içermeyen düz bir metin dizesiyse kullanmanız gereken tam olarak eşdeğer bir yardımcı programdır .

Öyleyse, düz bir metin dizginiz varsa ve tüm sistemdeki her dosyada onu aramak istiyorsanız:

$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 fgrep texthere

İzin olan şey ... Açıkçası, okuyamadığın dosyalar olacak. Kaçabilirsiniz ya findve fgrepbirlikte sudoonlara önüne:

$ sudo find ... | xargs -0 sudo fgrep texthere

Ya da başka bir -permbayrak yapmayı deneyebilirsiniz find(ve giremeyeceğiniz dizinleri görmezden gelmesini sağlayın), ama bu çok zaman alır ve gülünç derecede uzun bir komut satırına neden olur, bu yüzden burada bunu yapmayacağım.

Ya da sadece sudo -sbir kök kabuğu alıp oradan o şeyi koşturmak için olabilirsiniz ... ama genel olarak bunu öneriyorum çünkü insanlar kendilerini unutmadan sistemlerini bozmaya meyillidirler root.

BİR ÇÖZÜM , sistemdeki tüm dosyaları locatebulmak için bu komutu kullanmak olacaktır .txt. locateKomut dosyası hiyerarşi arama yerine (o kadar genellikle, günlük olarak güncellenen bir veritabanı kullanır gelmez tüm dosyalar olabilir). Veritabanı yalnızca tüm kullanıcılar tarafından erişilebilen dizinlerdeki dosyaları içerir, bu nedenle kendi dizinlerinizdeki okuma izinlerini kaldırırsanız, dosyalarınız orada olmaz.

Bu nedenle, findyukarıdaki komutu locateneredeyse eşdeğeri ile değiştirmek :

$ locate '*.txt' -0 | xargs -0 fgrep texthere

-0Seçeneği (veya --nullbazı sistemlerde) tekabül --print0seçeneği find.

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.