Yerini bulmak vs bulmak: kullanım, artılarını ve birbirlerinin eksilerini


Yanıtlar:


166

locate(1)üzerinde tek bir büyük avantaja sahip find(1): hız.

find(1)Bununla birlikte, birçok avantajı vardır locate(1):

  • find(1)ilkel, AT&T Unix'in ilk sürümüne geri dönüyor . Hatta Busybox aracılığıyla indirgenmiş gömülü Linux'larda bile bulacaksınız . Hepsi evrenseldir.

    locate(1)olduğundan çok daha genç find(1). İlkel atası locate(1) 1983'e kadar görünmedi , ve o "olarak yaygın mevcut değildi locateonaylandığını da 1994 yılına kadar" GNU findutils içine ve 4.4BSD içine .

  • locate(1)ayrıca standart değildir , bu nedenle varsayılan olarak her yere kurulmaz. Bazı POSIX tipi işletim sistemleri bile bir seçenek olarak sunmuyor ve mümkün olduğu yerlerde, kullanılabilir olması gereken minimum özellik kümesini belirleyen bağımsız bir standart bulunmadığından, uygulamada istediğiniz özellikler bulunmuyor olabilir.

    Orada bir olduğunu fiilen standart, varlık BSDlocate(1) , ancak diğer iki ana tatlar Çünkü sadece olmasıdır locateonun tüm seçenekleri uygulamak: -0, -c, -d, -i, -l, -m, -s, ve -S. mlocateBSD 6 ek seçenekler değil uygular locate: -b, -e, -P, -q, --regexve -w. GNUlocate olanlar altı artı başka uygulayan dört : -A, -D, -E, ve -p. (Takma adları ve -?vs -hvs gibi küçük farklılıkları görmezden geliyorum --help.)

    BSD'ler ve Mac OS X, BSD'yi sunar locate.

    Linux'ların çoğu GNU'yu gönderiyor locate, ancak Red Hat Linux'ları ve Arch'leri mlocatebunun yerine gemi . Debian ya ana kurulumunda kurulmaz, ancak her iki sürümü de varsayılan paket havuzlarında sunar; her ikisi de bir kerede kurulursa, " locate" çalışır mlocate.

    Oracle, 2014 yılının Aralık ayında piyasaya sürülen mlocate11.2'den bu yana Solaris'te sevkiyat yapıyor . Bundan önce locateSolaris'te varsayılan olarak kurulmadı. (Tahminen bununla Solaris'in komut uyumsuzluğu azaltmak için yapıldı Oracle Linux edilir Red Hat Enterprise Linux tabanlı de kullanır mlocate.)

    IBM AIX hala herhangi bir sürümünü birlikte gelmez locate, en azından AIX 7.2 itibariyle GNU'yu yüklemek sürece, findutilsgelen Linux Uygulamaları için AIX Toolbox .

    HP-UX da görünür yoksun locatebaz sisteminde.

    Daha eski olan "gerçek" Unix'ler genellikle bir uygulamasını içermiyordu locate.

  • find(1)birçok işlev, Boolean operatörü , vb. ile güçlü bir ifade sözdizimine sahiptir .

  • find(1)Dosyaları sadece isimden daha fazla seçebilir. Bu seçim yapabilir:

    • yaş
    • boyut
    • sahip
    • dosya tipi
    • zaman damgası
    • izinler
    • alt ağacın içindeki derinlik ...
  • Dosyaları ada göre bulurken , düzenli ifadeleri kullanarak dosya globbing sözdiziminifind(1) veya GNU veya BSD sürümlerinin tüm sürümlerinde arama yapabilirsiniz .

    Geçerli sürümleri, locate(1)glob modellerini olduğu gibi kabul findeder, ancak BSD locatehiçbir şekilde regex yapmaz. Benim gibiyseniz ve çeşitli makine türlerini kullanmak zorundaysanız grep, -rveya bağımlılık oluşturmayı tercih ederken kendinizi filtrelemeyi tercih edersiniz --regex.

    locatefiltrelemeden daha fazlasına ihtiyacı findvar çünkü ...

  • find(1)mutlaka tüm dosya sistemini aramaz. Genellikle, üzerinde çalışmasını istediğiniz tüm dosyaları içeren bir ebeveyn olan bir alt dizine işaret edersiniz. Bir locate(1)uygulamanın tipik davranışı , deseninize uyan tüm dosyaları grepfiltrelemeye bırakarak filtrelemeye bırakma ve patlamanın boyuta indirgenmesidir.

    (Evil ipucu: locate /muhtemelen sistemdeki tüm dosyaların bir listesini alırsınız!)

    Kullanıcı izinlerine dayanarak çıktıyı kısıtlayan locate(1)benzeri türevleri vardır slocate(1), ancak bu locateherhangi bir ana işletim sisteminde varsayılan sürüm değildir .

  • find(1)Sadece bulmaya ek olarak bulduğu dosyalara bir şeyler yapabilir . En güçlü ve yaygın olarak desteklenen bu tür bir operatör var -exec, ancak başkaları da var. Yakın zamanda GNU ve BSD uygulamaları buluyor, örneğin, siz -deleteve -execdiroperatörleriniz var.

  • find(1) gerçek zamanlı olarak çalışır, bu yüzden çıkışı her zaman günceldir.

    Çünkü locate(1)geçmişte bir veritabanı güncelleştirilmiş saat veya gün dayanıyor, çıkış modası geçmiş olabilir. (Bu eski önbellek sorunu .) Bu madalyonun iki yüzü var:

    1. locate artık varolmayan dosyaları adlandırabilir.

      GNU locateve mlocatesahip -eher geçmişte keşfedilen dosya adını yazdırmadan önce dosya varlığını denetlemek yapmak bayrağı, ancak bu bazı uzak yiyen locatehız avantajı ve BSD mevcut değildir locateüstelik.

    2. locate Son veritabanı güncellemesinden bu yana oluşturulan dosyaları adlandırmakta başarısız olur.

    locateHatalı olabileceğini bilerek , çıktılara biraz güvenilmez olmayı öğrenirsiniz .

    Bu sorunu çözmenin yolları var, ancak yaygın kullanımda herhangi bir uygulamanın farkında değilim. Örneğin, var rlocate, ancak herhangi bir modern Linux çekirdeğine karşı çalışmadığı görülüyor .

  • find(1) Asla çalışan kullanıcının sahibinden başka bir imtiyaz yoktur.

    Çünkü locatebir sistem üzerindeki tüm kullanıcılara küresel olarak hizmet veren, onun gelmiş istediği updatedbsüreç olarak çalıştırmak rooto tüm dosya sistemini görebilirsiniz. Bu, bir dizi güvenlik problemine yol açar:

    1. updatedbKök olarak çalıştırın , ancak çıktı dosyasını dünya tarafından okunabilir kılın, böylece locateözel ayrıcalıklar olmadan çalışabilir. Bu, sistemdeki tüm dosyaların adlarını tüm kullanıcılara etkili bir şekilde gösterir. Bu, gerçek bir soruna neden olacak bir güvenlik ihlali için yeterli olabilir.

      BSD locate, Mac OS X ve FreeBSD'de bu şekilde yapılandırılmıştır.

    2. Veritabanını sadece tarafından okunabilir şekilde yazın ve veritabanını okuyabilmesi rootiçin locate setuidroot yapın . Bu locate, işletim sisteminin izin sistemini etkili bir şekilde yeniden düzenlemek zorunda olduğu için normalde göremediğiniz dosyaları göstermediği anlamına gelir . Ayrıca , sisteminizin saldırı yüzeyini de arttırır , özellikle de bir kök yükseltme saldırısını tehlikeye atar .

    3. locateVeritabanı dosyasına sahip olmak için özel bir " " kullanıcı veya grup oluşturun ve locateikili dosyayı setuid/setgidbu kullanıcı / grup için işaretleyin, böylece veritabanını okuyabilir. Bu, ayrıcalık yükseliş saldırılarını tek başına engellemez, ancak birinin neden olabileceği hasarı büyük ölçüde azaltır.

      mlocateRed Hat Enterprise Linux'ta bu şekilde yapılandırılmıştır .

      Yine de bir probleminiz var, çünkü bir hata ayıklayıcıyı kullanabilir locateveya çekirdeği dökmesine neden olabilirseniz, veritabanının ayrıcalıklı bölümlerine erişebilirsiniz.

    Gerçekten "güvenli" bir locatekomut oluşturmanın bir yolunu görmüyorum , sistemdeki her bir kullanıcı için ayrı ayrı çalıştırmanın dışında, avantajını büyük oranda azaltıyor find(1).

Alt satırda, her ikisi de çok faydalıdır. locate(1)Sadece var olduğunu bildiğiniz, ismiyle belirli bir dosyayı bulmaya çalıştığınızda daha iyidir, ancak tam olarak nerede olduğunu hatırlamıyorsunuz. find(1)incelemek için odaklanmış bir alana sahip olduğunuzda veya birçok avantajından herhangi birine ihtiyacınız olduğunda daha iyidir.


Üzgünüm, "slocate" paragrafını gözardı ettim. rlocate, eski önbellek sorununu giderir . find -- "$dir" Sağlam değil ( $dirbir tahminde bulunabilir) gibi bulgunun tuhaflıklarından bazılarından bahsetmek isteyebilirsiniz , bir sembolik bağın niteliklerini test etmenin bir yolu yoktur, yarış durumu sorunları ... Benim için findve locateiki farklı sorunu ele alın. Find kullanımının gerçekçi olmadığı pek çok yer var (milyonlarca dosya içeren dizinler gibi). locate, dosya adlarıyla sınırlı bir indeksleme sistemidir.
Stéphane Chazelas,

2
İlk uygulamaları locatekabaca bir şey gibiydi find / -type f | gzip > locate.gzvezgrep "$1" <locate.gz
F. Hauri

@ F.Hauri: İlginç bilgiler. GNU: İşte fazlası var locateise findutilspaketin ve bunun updatedbprogramı açısından uygulanmaktadır find(1). Yani bu anlamda, locate(1)aslında gerektirir find(1) . :)
Warren Young

1
@WarrenYoung neden sadece foo yerine foo (1) 'a sabit bir referans var? foo'nun farklı versiyonları var mı?
natty

4
@nuttyaboutnatty: O hayır olmadığı doğru olmakla birlikte manuel bölüm 1. anlamı Unix el antik bir kongre, var find, locatebunun farklı bölümlerinde kullanılan aynı ada belirsizliği giderecek orada olmak zorunda değildir bu yüzden diğer bölümlerdeki vb el kitabını (örneğin, unlink(1)vs unlink(2)), sözleşmeye alıştığımız kişi bunu man sayfası referansı olarak görüyor.
Warren Young,

35

locatefinddosyaları bulmak için bir dosya sistemi üzerinde yinelenirken düzenli olarak güncellenmesi gereken önceden oluşturulmuş bir veritabanı kullanır .

Bu nedenle, locateçok daha hızlıdır find, ancak veritabanı -bir önbellek olarak görülebilir- güncellenmemişse yanlış olabilir ( updatedbkomuta bakınız ).

Ayrıca, dosya adlarına göre eşleşen bir desen kullanırken find, dosyaları her özelliğine göre filtreleyebildiğiniz için daha fazla ayrıntı düzeyi sunabilir locate.


7

findAcemi veya arada bir Unix kullanıcısının, man sayfasını dikkatlice incelemeden başarılı bir şekilde kullanması mümkün değildir. Tarihsel olarak, bazı sürümleri kullanıcı düşmanlığına ekleyerek find, -printseçeneği bile varsayılan değildi .

locate daha az esnektir, ancak ortak durumda kullanmak çok daha sezgiseldir.


1
Öte yandan, bir DB'nin bulunması ve periyodik olarak çalıştırılması gerektiğini bulmak için özel ağımızda bulunan tüm Linux sunucularında devre dışı bıraktım.
Rui F Ribeiro

2
Nesi zor? find . -name 'nametosearch'veya büyük / -inameküçük harfe duyarlı değildir. .Geçerli dizin dışında arama yapmak için bir dizin yolu ile değiştirin . İşte, acemi bir kullanıcının gereksinimlerinin% 90'ı dosya taşma işine girmeden karşıladı. (Genellikle kullanmak find . -iname '*partialfilename*'ve nereden Arıyorum eğer /, kullandığım find / -maxdepth 5 -iname '*partialname*'ben var, ara kullanıcıların gereksinimleri% 75% 90 oranında zaman ilgilendiğim her şeyi bulurken arama süresini azaltır hangi..) :)
Joker

2

Bulmanın küçük bir dezavantajı, ilgilendiğiniz dosya sisteminin alanını endekslemeyebilmesidir. Debian masaüstü sistemlerinde, örneğin Linux Mint 17.2'de, /etc/updatedb.conf dosyası, belirli alanları dikkate almayacak şekilde yapılandırılmıştır. / tmp, / var / spool ve /home/.ecryptfs dahil olmak üzere.

/Home/.ecryptfs dosyasını dikkate almamak, şifreli dizinlerdeki dosya adlarının yetkisiz kullanıcılara maruz kalmasını önler. Ancak, giriş dizininiz ecryptfs ile şifrelenmişse, giriş dizininizin dizine alınmadığı anlamına gelir ve bu nedenle bulun, bu nedenle giriş dizininizde hiçbir şey bulamaz. Bu sizin için büyük ölçüde işe yaramaz hale getirebilir (benim için yapar). Sonuçların bulunmamasına ek olarak, updatedb işlemi düzenli aralıklarla diskinize yarar sağlamaz ve sistemin ana veya tek kullanıcısıysanız devre dışı bırakılabilir.

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.