Yanıtlar:
GÜNCELLEME : Bulun argümanları ile ilgili olarak kabuğun dosya adı genişletmesine karşı locate'nin regex seçeneğini kullanma hakkında bir not ...
KABUK Dosyaismi
Yazdığınız locate /bin/b*
(not tırnaksız vardır), çeşitli şeyler olur.
locate
birçok bireysel komut satırında olduğu gibi geçirilir . locate
daha sonra bu argülerin her birini veritabanındaki her bir dosyaya karşı test eder ve eşleşmeleri çıkarır. Bununla birlikte, 'bulun' öğesinin geçerli çalışma diziniyle ilgili bir kavramı olmadığını unutmayın. Bu sadece sizin argümanlarınızı veritabanındaki tam dosya isimleri ile eşleştirir .
Bu, her ikisiyle de eşleşeceği /bin/bash
ve /home/user/bin/brackets
bu şekilde bir dereceye kadar kontrolünüz olduğu anlamına gelir; ancak, konum bulma regex araması daha fazlasını sunar; Bulun diğer seçeneklerinde olduğu gibi.
LOCATE'S REGEX SEÇENEĞİ Basit hatalarla
yaptığınızdan locate -r "/bin/b.*"
farklı şeyler yazdığınızda .. ( kabuk genişlemeli hatalar sadece basit hataların bir listesidir)
-r
Seçenek söyler bulmak regex desen olarak arg tedavi etmek. locate -r "^/bin/b.*"
ile başlayan dosya isimleri üretir . ile başlayan dosya adlarını üreten / home / kullanıcı / bin / b .. Not olduğunu ~ / edilir değil "tırnaklar" ile korunan ve dolayısıyla tabidir yaklaşık-genişleme kabuk dönüştürür ~ / içine / home / user / locate -r ~/"bin/b.*"
Özet: "kabuk dosya adı genişlemesi", "regex" den oldukça farklı
Şimdi orijinal gönderiye dönelim:
locate
genellikle tüm veritabanını stdout'a listeler, bu nedenle onu filtrelemeniz gereken belirli bir dizine sınırlandırmak için ... Bunu locate'nin seçenekleriyle yapabilirsiniz.
Sadece kabarıklıktan ziyade konum bulma regex özelliğini kullanabilirsiniz ... ( locate /dir/myfile*
kabarıklıktır) ...
Gönderen bilgi bulun : -r
,--regex
not: -i = büyük / küçük harf yoksay
. . . . . -r = regex
. . . . . ~ /, kabuk tarafından / home / user öğesine genişletilecektir (~ / tırnak içinde olmadığında)
. . . . . '\' (baskslash + boşluk; tırnak yok) hazır bilgi alanıdır (kabuk genişlemesini önlemek için). Dizeyi tırnak işaretleri içine alabilirsiniz, ancak tırnak işaretlerinin dışında ~ / işareti bıraktığınızdan emin olun : ~/my\ regex
veya-/"my regex"
Örneğin. locate -ir ~/".*"la\ bella\ vita
aynıdır locate -ir ~/".*la bella vita"
ve tüm ev dizini dizilerinizi her yerde bulunan "La Bella Vita" için arayacaktır.
Aramayı yalnızca dosya adıyla da sınırlayabilirsiniz, ancak -b
veya --basename
.. komutunu kullanarak bu durumda regex satır başlangıcı yalnızca temel ad için ^
geçerlidir ...
En sık kendimi kullanırken buluyorum locate -bir
PS .. Locate
o kadar hızlı ki, hiç kullanmadım find
... ne de nautilus araması yapmamıştım (çok yavaş)
'Locate' ile, yeni eklenmiş bir şey arıyorsanız, sadece sudo updatedb
locate veritabanını yenilemek için çalıştırın ... (ama yeni eklediyseniz, muhtemelen nerede olduğunu biliyorsunuzdur:) ....
Bu şekilde grep ile borulayın
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Düzenleme: Diğer cevap daha iyidir, bulmak için bir kalıp geçirebileceğinizi bilmiyordum.
locate
bir O(log(n))
arama yaptığı için locatedb
, o zaman zaten azaltılmış alt sonuçlar üzerinde grep
bir O(m)
arama yapmak için ' regex'i kullanabilirsiniz . (girişlerin n = toplam sayısı locatedb
[yani sizin sürücünün tüm dosyaları], m = # az Gözlerinde farklı eşleşen girişlerin locatedb
), toplam çalışma karmaşıklığı: O(log(n)) + O(m)
m ortalama üzerindedir log(n)
getirecek şekilde, 2*O(log(n))
aksine, O(n)
sen gerçekleştirdiğinizde içindeki tüm girişler üzerinde bir regex sorgusu locatedb
.
O(log(n))
regex arama iken O(n)
? Db cinsinden girişlerin miktarı her durumda aynıdır. Sanırım arama algoritması mı?
Kullanabilirsin. Daha locate /rootpath/*filenamespec
önce denemedim, ama işe yarıyor gibi görünüyor. Örneğinizi yapmak içinlocate /home/tim/science/*math*
Bu tür davranışlardan find
ziyade komuta bakmak isteyebilirsiniz locate
. Sözdizimi olurdu find rootforsearch -name filenamepattern -print
. Bu durumda, örneğinizin gerektirecek find /home/tim/science -name *math* -print
kadar hızlı olması gerekir . Aranacak veritabanının olmadığı kadar hızlı bir şekilde bulun ... gerçekte dosya sistemini arar. Dosyayla gerçekten bir şeyler yapmayı düşünüyorsanız, yazdırmak dışında da kullanabileceğiniz birçok seçenek vardır.
locate
(başka herhangi bir yardımcı program gerektirmez grep
) ve regexps kullanmaz (ki bu güzel, ama bu durumda gereksiz).
Benim için en uygun
cd /home/tim/science
locate math | grep `pwd`