Yanıtlar:
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 locate
onaylandığı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 locate
onun tüm seçenekleri uygulamak: -0
, -c
, -d
, -i
, -l
, -m
, -s
, ve -S
. mlocate
BSD 6 ek seçenekler değil uygular locate
: -b
, -e
, -P
, -q
, --regex
ve -w
. GNUlocate
olanlar altı artı başka uygulayan dört : -A
, -D
, -E
, ve -p
. (Takma adları ve -?
vs -h
vs 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 mlocate
bunun 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 mlocate
11.2'den bu yana Solaris'te sevkiyat yapıyor . Bundan önce locate
Solaris'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, findutils
gelen Linux Uygulamaları için AIX Toolbox .
HP-UX da görünür yoksun locate
baz 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:
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 find
eder, ancak BSD locate
hiçbir şekilde regex yapmaz. Benim gibiyseniz ve çeşitli makine türlerini kullanmak zorundaysanız grep
, -r
veya bağımlılık oluşturmayı tercih ederken kendinizi filtrelemeyi tercih edersiniz --regex
.
locate
filtrelemeden daha fazlasına ihtiyacı find
var çü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ı grep
filtrelemeye 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 locate
herhangi 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 -delete
ve -execdir
operatö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:
locate
artık varolmayan dosyaları adlandırabilir.
GNU locate
ve mlocate
sahip -e
her geçmişte keşfedilen dosya adını yazdırmadan önce dosya varlığını denetlemek yapmak bayrağı, ancak bu bazı uzak yiyen locate
hız avantajı ve BSD mevcut değildir locate
üstelik.
locate
Son veritabanı güncellemesinden bu yana oluşturulan dosyaları adlandırmakta başarısız olur.
locate
Hatalı 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ü locate
bir sistem üzerindeki tüm kullanıcılara küresel olarak hizmet veren, onun gelmiş istediği updatedb
süreç olarak çalıştırmak root
o tüm dosya sistemini görebilirsiniz. Bu, bir dizi güvenlik problemine yol açar:
updatedb
Kö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.
Veritabanını sadece tarafından okunabilir şekilde yazın ve veritabanını okuyabilmesi root
için locate
setuid
root 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 .
locate
Veritabanı dosyasına sahip olmak için özel bir " " kullanıcı veya grup oluşturun ve locate
ikili dosyayı setuid/setgid
bu 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.
mlocate
Red 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 locate
veya çekirdeği dökmesine neden olabilirseniz, veritabanının ayrıcalıklı bölümlerine erişebilirsiniz.
Gerçekten "güvenli" bir locate
komut 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.
find -- "$dir"
Sağlam değil ( $dir
bir 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 find
ve locate
iki 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.
locate
kabaca bir şey gibiydi find / -type f | gzip > locate.gz
vezgrep "$1" <locate.gz
locate
ise findutils
paketin ve bunun updatedb
programı açısından uygulanmaktadır find(1)
. Yani bu anlamda, locate(1)
aslında gerektirir find(1)
. :)
find
, locate
bunun 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.
locate
find
dosyaları 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 ( updatedb
komuta 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
.
find
Acemi 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
, -print
seçeneği bile varsayılan değildi .
locate
daha az esnektir, ancak ortak durumda kullanmak çok daha sezgiseldir.
find . -name 'nametosearch'
veya büyük / -iname
küçü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..) :)
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.