İ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 /etc
veya 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.
find
Bakı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 f
vardı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 find
ve grep
yaptığı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 nul
karakter ( \0
) ile sınırlandırılacağı anlamına gelir . Ve xargs
bu nul
ayrı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 -F
arama 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 find
ve fgrep
birlikte sudo
onlara önüne:
$ sudo find ... | xargs -0 sudo fgrep texthere
Ya da başka bir -perm
bayrak 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 -s
bir 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ı locate
bulmak için bu komutu kullanmak olacaktır .txt
. locate
Komut 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, find
yukarıdaki komutu locate
neredeyse eşdeğeri ile değiştirmek :
$ locate '*.txt' -0 | xargs -0 fgrep texthere
-0
Seçeneği (veya --null
bazı sistemlerde) tekabül --print0
seçeneği find
.
grep
?