bul ve bul


30

Orada komutlar findve locatediskteki dosyaları aramak için.

findDosyaları aramak için gerekli tüm alt dizinleri yinelemeli olarak işlediğini ve bu nedenle yavaş ama güncel olduğunu biliyorum; oysa locateki güncel olmayan sonuçları hızlı bir şekilde göstermek için her şimdi ve sonra (tam olarak ne zaman?) Güncellenen bir veritabanı kullanıyor.

Başka bir fark var mı? Hangi durumlarda biri birini ya da diğerini tercih eder? locateVeritabanı genellikle ne zaman güncellenir?



1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html "updatedb, varsayılan veritabanını güncellemek için genellikle cron (8) tarafından günlük olarak çalıştırılır."
Rinzwind

@Rinzwind Bağlantılı U&L yanıtı harika, siteler arası kopya yapamayacağımız bir utanç. Ama cronjob hakkında daha çok şey biliyor musun, tam olarak ne zaman çalışacak? Başlangıçtan sonra mı? Belli bir zamanda (sanırım 1-2AM ya da onun gibi bir şey okudum). O zaman kapatılırsa ne olur? Bilgisayar boştayken başlıyor mu? Veritabanının yaşını nasıl görebilirim?
Byte Commander

2
@ByteCommander - Bunun anacroniçin var. Masaüstü sistemlerde / sunucularda varsayılan olarak yüklü olup olmadığını bilmiyorum, ancak dizüstü bilgisayarlarda. Önyükleme sırasında çalışır ve sistem kapalıyken herhangi bir cron işinin çalışması gerekip gerekmediğini görür ve çalışır. Gerçekten yararlıdır, ancak gece yarısından uzakta bir iş planınız varsa, bazı sorunlara neden olabilir. Bu, işin önyüklemesinde çalıştırılmasına ve sonra zaman geldiğinde tekrar çalışmasına neden olabilir - muhtemelen 24 saat sonra çok daha az (günlük bir iş için).
Joe

@Joe Önyükleme sırasında çalışır mı ve yavaşlar mı yoksa önyüklemeden bir süre sonra mı çalışır, yoksa genellikle sistem boştayken çalıştığı düşük bir öncelikle mi çalışır?
Byte Commander

Yanıtlar:


27

locategerçekten sadece dosyaları bulmak ve onları insanlara göstermek için iyidir. Bununla birkaç şey yapabilirsin, ama ayrıştırmak için yeterince güvenemem ve - söylediğin gibi - iç veritabanının durumunu garanti etmek imkansız çünkü daha çok /etc/cron.daily/mlocategünde sadece bir kere çalıştırılması planlanıyor !

findcanlı. Filtreler, hariç tutar, çalıştırır. Ayrıştırma için uygundur. Bağıl yollar çıkartabilir. Tüm yolları çıkartabilir. Sadece isimlere değil, özelliklere göre işler yapabilir.

locatekesinlikle benim araç kutumda bir yer var ama genellikle bir şey bulmak için son hendek çabası olarak en altta. Çok daha kolay find.


2
locateDosya sistemimin tamamını aramak istersem çok daha hızlı buluyorum . Ve kullanmadan updatedbönce veritabanını elle güncelleyebilirsiniz .
hytromo

Bu cronjob'ın tam olarak nasıl yapılandırıldığını biliyor musun? Belirli bir zamanda mı yoksa sistem başlangıçta boşta mı yoksa n dakika sonra mı çalışıyor? Çünkü makinem genellikle kapatıldığı zaman 1-2:00 de programlandığını bir yerlerde okudum sanırım. Manuel olarak ( sudo updatedb) dışında asla güncellenmeyecek mi? Veritabanının kaç yaşında olduğunu görme şansı var mı?
Byte Commander

grep run-parts /etc/crontabBunların yönetildiğini anacrongöreceksiniz (bunların arasında man anacronher zaman olmayan sistemlere daha dayanıklı olduğunu göreceksiniz ). Gördüğüm kadarıyla orijinal cron zamanını kaçırırsanız, açılışta çalıştırması gerekir.
Oli

2
Bu konumlandırmanın çıkarılabilir / bağlantısız bölümlerimi endekslemediğini tespit ediyorum, bu yüzden üzerlerinde bir şey bulmak istersem, bulmak zorundayım. Elbette, locate bulunan tüm şaşırtıcı seçeneklere sahip değildir - -exec command {} \;bulunan her dosya için bir komut çalıştırmayı sever . locate -bYolun geri kalanı olmadan, adın son bileşeniyle eşleşen dosyaları bulmayı belirleyen kısıtlayıcıları kullanmayı severim . Sık sık bunu denerim çünkü çok hızlı. Ayrıca, sudo updatedbbulma veritabanını yenilemek istediğiniz zaman çalıştırabilirsiniz .
Joe

aynı zamanda biraz kolay olan gerçek zamanlı aramaya ihtiyacınız varsa, gibi bir şey kullanabilirsinizls -R | grep 'file_name.txt'
jena

8

Oli'yi sevdiğim kadar (bu çok fazla!) Komutada onunla aynı fikirde değilim find. Beğenmedim

find komut üç dakikadan fazla sürüyor

Örneğin bu basit komutu ele alalım:

$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
    (... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied

real    3m40.589s
user    0m4.156s
sys     0m8.874s

Bu devraldı üç dakika boyunca findgelen her şeyi başlangıç aramak için /. Varsayılan olarak, hata iletilerinin bir kısmı görünür ve aradığınızı bulmak için aralarında arama yapmanız gerekir. Yine de 53 saatgrep süren bir dizgede tüm sürücüyü aramaktan daha iyidir : bir dizgede tüm dosyaları greplemek uzun zaman alır

Daha iyi çalışmasını sağlamak için find komutunun parametrelerini öğrenebileceğimi biliyorum, ancak buradaki mesele, çalışması için gereken zaman miktarı.

locate komut bir saniyeden daha az sürer

Şimdi kullanalım locate:

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

Bulun komutu, bir saniyeden daha kısa sürer!

updatedb yalnızca varsayılan olarak günde bir kez çalıştır

Konum bulma veritabanınıupdatedb güncelleyen komutun varsayılan olarak yalnızca günde bir kez çalıştırıldığı doğrudur . Kullanarak yeni eklenen dosyaları aramadan önce manuel olarak çalıştırabilirsiniz:

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

Bu işlem 3 saniye sürecek olsa da, findkomutun 3+ dakikasına kıyasla küçük .

Satırıma sudo crontab -een alt çizgiyi ekleyecek şekilde güncelledim :

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

Şimdi her beş dakikada updatedbbir çalıştırılıyor ve locatekomutlar veritabanı neredeyse her zaman güncel.

Fakat hiçbir özellik yok mu?

Sen boru can locatediğer komutlara çıktı. Örneğin, dosya özelliklerini kullanmak istiyorsanız:

$ locate mail-transport-agent.target | xargs stat
  File: '/lib/systemd/system/mail-transport-agent.target'
  Size: 473         Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d   Inode: 667460      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
 Birth: -

özet

Kullanım hızını ve kolaylığını göstermek için bu cevabı gönderdim locate. Diğerleri tarafından gösterilen bazı kısa açıklamaların bazılarını ele almaya çalıştım.

findKomut dosyaları bulabilmek için tüm dizin yapısını çapraz gerekiyor. locateKomut kıyasla Bu yıldırım hızıyla verir, bu kendi veritabanına sahiptir.


@EliahKagan Ancak find komutu, tüm sürücülerdeki tüm dizinleri ve dosyaları bir bölüme kaydırıp listeliyordu. Çalışıyor gibi görünüyordu ve sonunda bir çıktı bekliyordum ... Her iki durumda da, bul komutunun araştırmasını "düzeltmek" değildi. Çalışan locate / display-auto-brightness17 saniye sürer ve tüm disklerdeki her dizini ve dosyayı da görüntüler.
WinEunuuchs2Unix

@EliahKagan anlıyorum. --regexArama dizgime döndürülen çok fazla sonuç olduğu için gerekliydi. Cevabımı birkaç dakika içinde bulup bulup güncellemek için iki yeni örnek bulacağım.
WinEunuuchs2Unix

1
O, Eliah bakış açısını netleştirmek için findkomut araçları "dizinleri tüm dosyaların adlarını yazdırmak /ve display-auto-brightness." Bence kullanmak istemiştin find / -name display-auto-brightness, ama bu bile çok fazla önemsiz "İzin reddedildi" hatası veriyor .
wjandrea

@wjandrea Evet, noktanın dosyayı bulamadığını söylediğim gibi, bulma komutunun zamanı gelmişti. Önbellekleri temizledikten sonra şimdi geçerli parametrelerle testleri tekrar ediyorum. Sonra cevabı güncelleyeceğim.
WinEunuuchs2Unix

1
@ Hayır, örneğiniz hala geçerlidir ve işlem zamanının dosyanın bulunup bulunmadığına bakılmaksızın çok fazla değiştiğini sanmıyorum.
wjandrea
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.