Belirli bir dizinin altındaki “locate” kullan?


46

"Bul" arama aralığını bazı dizinlerle nasıl kısıtlayacağımı merak ediyordum.

Örneğin, isimleri "/ home / tim / science /" dizini altındaki "math" dizgisine sahip dosya / dizinleri nasıl bulabilirim?

Teşekkürler ve saygılar!

Yanıtlar:


30

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.

  1. İlk olarak, kabuk dosya adı-genişletme özel kabuk kalıp karakteristiğini * genişletecektir (Bunun nedeni * korumasız olmasıdır, yani "çift tırnak işareti" yoktur).
  2. Bu ortaya çıkan genişleme dosya adlarının bir listesidir . Hangi belki de çok uzun ... Bu liste locatebirçok bireysel komut satırında olduğu gibi geçirilir .
  3. 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)

  1. -rSeçenek söyler bulmak regex desen olarak arg tedavi etmek.
  2. Tırnak işaretleri *, kabuk dosya adı genişlemesinden korunur. Bu * ve nokta anlamına gelir. şimdi özel regex karakterleri
  3. Regex olarak, 'locate' komutunu veri tabanı girdisine çeşitli yollarla eşleştirmesini kolayca söyleyebilirsiniz: eg1. / bin / b ... eg2 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

  • "... (regex) eşleşmeleri tüm yol adına göre yapılır ve bu nedenle varsayılan olarak, herhangi bir kısmı belirtilen normal ifadeyle eşleşirse bir yol adı eşleşir. Normal ifade, eşleşmeyi tutturmak için ^ veya $ düğmesini kullanabilir . Bir yol adının başlangıcı veya sonu. "

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\ regexveya-/"my regex"

Örneğin. locate -ir ~/".*"la\ bella\ vitaaynı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 -bveya --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 .. Locateo 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 updatedblocate veritabanını yenilemek için çalıştırın ... (ama yeni eklediyseniz, muhtemelen nerede olduğunu biliyorsunuzdur:) ....


13

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.


@Adam .. Yönteminizi küçümseme; Tamam, tamam ama bulmak için grep yerine kendi regex komutunu kullanabilirsiniz. Başvurduğunuz "diğer" yöntemi, regex kullanmıyor ve oldukça farklı davranıyor. cevap ...
Peter.O

2
daha az bulun | grep ^ / bin, -r ^ / bin /.* işaretini bulmaktan çok daha hızlıdır, çünkü daha az bulun, daha az kelime için etkin bir arama yapar ve -r 'nin bulunduğu yerdeki tüm girişler üzerinde regex işlemi gerçekleştirir
Marcel Valdez Orozco

@MarcelValdezOrozco "Kelimenin verimli aranması" nedir ve neden regex'ten daha hızlı?
Flashrunner

@Flashrunner Regex olmayan bir arama sorgusu verdiğinizde locatebir O(log(n))arama yaptığı için locatedb, o zaman zaten azaltılmış alt sonuçlar üzerinde grepbir 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.
Marcel Valdez Orozco

@MarcelValdezOrozco Ama db üzerinde neden olmayan regex aramasıdır O(log(n))regex arama iken O(n)? Db cinsinden girişlerin miktarı her durumda aynıdır. Sanırım arama algoritması mı?
Flashrunner

8

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 findziyade komuta bakmak isteyebilirsiniz locate. Sözdizimi olurdu find rootforsearch -name filenamepattern -print. Bu durumda, örneğinizin gerektirecek find /home/tim/science -name *math* -printkadar 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.


Bu, kullandığı en iyi cevaptır locate(başka herhangi bir yardımcı program gerektirmez grep) ve regexps kullanmaz (ki bu güzel, ama bu durumda gereksiz).
Tom,

Bu gerçekten dosyaları belirli bir dizin yolu içinde bulmak için kullanabileceğiniz bir cazibe gibi çalışır, teşekkürler @Nerdfest
amit_game 15:30 '

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.