temukan vs. temukan

30

Ada perintah finddan locateuntuk mencari file di disk.

Saya tahu bahwa findsecara rekursif memproses semua subdirektori yang diperlukan untuk mencari file dan karena itu lambat tetapi mutakhir, sedangkan locatemenggunakan database yang diperbarui setiap saat (kapan tepatnya?) Untuk dengan cepat menunjukkan hasil yang mungkin sudah ketinggalan zaman.

Apakah ada perbedaan lain? Dalam situasi apa salah satu lebih suka yang satu atau yang lain? Dan kapan locatedatabase biasanya diperbarui?

Komandan Byte
sumber
1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html "updatedb biasanya dijalankan setiap hari oleh cron (8) untuk memperbarui database default."
Rinzwind
@Rinzwind Jawaban U&L yang ditautkan mengagumkan, sayang sekali kami tidak dapat membuat duplikat lintas-situs. Tapi apakah Anda tahu lebih banyak tentang cronjob, kapan tepatnya itu akan berjalan? Setelah startup? Pada waktu tertentu (saya pikir saya sudah membaca 1-2AM atau semacamnya) saja? Apa yang terjadi jika ditutup pada saat itu? Apakah ini dimulai saat komputer dalam keadaan diam? Bagaimana saya bisa melihat umur basis data?
Byte Commander
2
@ByteCommander - Itulah gunanya anacron. Saya tidak tahu apakah itu diinstal secara default pada sistem desktop / server, tetapi pada notebook. Ini berjalan saat boot dan melihat apakah ada tugas cron yang harus dijalankan saat sistem mati dan menjalankannya. Ini sangat membantu, tetapi dapat menyebabkan beberapa masalah jika Anda memiliki pekerjaan yang dijadwalkan jauh dari tengah malam. Itu dapat menyebabkan pekerjaan dijalankan saat boot dan sekali lagi ketika saatnya tiba - mungkin jauh lebih sedikit dari 24 jam kemudian (untuk pekerjaan sehari-hari.)
Joe
@Joe Jadi apakah itu akan berjalan saat boot dan memperlambatnya, atau akan berjalan beberapa saat setelah boot, atau apakah itu berjalan dengan prioritas rendah sehingga hanya berjalan ketika sistem hampir idle?
Byte Commander

Jawaban:

27

locatebenar-benar hanya baik untuk menemukan file dan menampilkannya kepada manusia. Anda dapat melakukan beberapa hal dengan itu, tetapi saya tidak akan mempercayainya cukup untuk menguraikan dan - seperti yang Anda katakan - tidak mungkin untuk menjamin keadaan basis data internal, lebih dari itu karena hanya dijadwalkan untuk dijalankan mulai /etc/cron.daily/mlocate, sekali sehari!

findhidup. Ini menyaring, mengecualikan, mengeksekusi. Ini cocok untuk parsing. Ini dapat menampilkan jalur relatif. Itu bisa menampilkan path lengkap. Itu bisa melakukan hal berdasarkan atribut, bukan hanya nama.

locatetentu saja memiliki tempat di kotak alat saya, tetapi biasanya tepat di bagian bawah sebagai upaya terakhir untuk menemukan sesuatu. Lebih mudah daripada findjuga.

Oli
sumber
2
Saya merasa locatejauh lebih cepat jika saya ingin mencari seluruh sistem file saya. Dan Anda dapat memperbarui basis data secara manual updatedbsebelum menggunakannya.
hytromo
Anda tahu bagaimana cronjob itu dikonfigurasi dengan tepat? Apakah itu berjalan pada waktu tertentu atau ketika sistem dalam keadaan diam atau n menit setelah startup? Karena saya pikir saya telah membaca di suatu tempat bahwa itu dijadwalkan pada jam 1-2 pagi, ketika mesin saya biasanya dimatikan. Apakah itu tidak akan pernah diperbarui, kecuali secara manual ( sudo updatedb)? Dan apakah ada peluang untuk melihat berapa umur databasenya?
Byte Commander
grep run-parts /etc/crontabAnda akan melihat bahwa ini dikelola anacron(yang akan Anda lihat man anacronlebih tangguh terhadap sistem yang tidak selalu ada). Dari apa yang saya lihat itu harus menjalankannya saat boot bukan jika Anda melewatkan waktu cron asli.
Oli
2
Saya menemukan bahwa loc tidak mengindeks partisi yang dapat dilepas / dilepas, jadi jika saya ingin menemukan sesuatu di dalamnya, saya harus menggunakan find. Tentu saja, loc tidak memiliki semua opsi luar biasa yang ditemukan tidak - suka -exec command {} \;menjalankan perintah pada setiap file yang ditemukan. Saya memang suka menggunakan locate -byang membatasi mencari untuk menemukan file yang cocok pada komponen akhir nama - tanpa sisa jalan. Saya sering mencobanya dulu karena sangat cepat. Selain itu, Anda dapat menjalankan sudo updatedbkapan saja Anda ingin me-refresh database loc.
Joe
jika Anda memerlukan pencarian waktu nyata yang juga agak mudah, Anda dapat menggunakan sesuatu sepertils -R | grep 'file_name.txt'
jena
8

Sebanyak saya suka Oli (yang banyak!) Saya tidak setuju dengan dia pada findperintah. Saya tidak suka itu.

find Perintah memakan waktu lebih dari tiga menit

Ambil contoh perintah sederhana ini:

$ 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

Butuh lebih dari tiga menit untuk findmencari semuanya mulai dari /. Secara default rim pesan kesalahan muncul dan Anda harus mencari melalui mereka untuk menemukan apa yang Anda cari. Masih lebih baik daripada grepmencari seluruh drive untuk sebuah string yang membutuhkan 53 jam : `grep`ing semua file untuk sebuah string membutuhkan waktu lama

Saya tahu saya bisa mengutak-atik parameter perintah find untuk membuatnya bekerja lebih baik tetapi intinya di sini adalah jumlah waktu yang diperlukan untuk menjalankan.

locate perintah memakan waktu kurang dari satu detik

Sekarang mari kita gunakan locate:

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

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

The menemukan perintah mengambil kurang dari satu detik!

updatedb hanya berjalan sekali sehari secara default

Memang benar updatedbperintah yang memperbarui basis data lokasi hanya berjalan sekali sehari secara default. Anda dapat menjalankannya secara manual sebelum mencari file yang baru saja ditambahkan dengan menggunakan:

$ time sudo updatedb

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

Meskipun ini akan memakan waktu 3 detik, itu kecil dibandingkan dengan find3+ menit perintah.

Saya telah memperbarui saya sudo crontab -euntuk memasukkan baris di bagian bawah:

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

Sekarang setiap lima menit updatedbdijalankan dan locateperintah basis data hampir selalu terkini.

Tetapi tidak ada atribut?

Anda dapat mem-pipe locateoutput ke perintah lain. Jika misalnya Anda menginginkan atribut file yang dapat Anda gunakan:

$ 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: -

Ringkasan

Saya memposting jawaban ini untuk menunjukkan kecepatan dan kemudahan penggunaan locate. Saya mencoba untuk mengatasi beberapa perintah singkat yang ditunjukkan oleh orang lain.

The findperintah perlu melintasi seluruh struktur direktori untuk menemukan file. The locateperintah memiliki itu database sendiri yang memberikan kecepatan kilat itu dibandingkan.

WinEunuuchs2Unix
sumber
@EliahKagan Tetapi perintah find sedang menggulung dan mendaftar semua direktori dan file di semua drive sebuah partisi. Tampaknya berfungsi dan saya mengharapkan hasil cetak pada akhirnya ... Apa pun itu bukan tentang "memperbaiki" pencarian perintah find itu tentang mendapatkan waktu. Menjalankan locate / display-auto-brightnessmembutuhkan waktu 17 detik dan juga menampilkan setiap direktori dan file di semua disk.
WinEunuuchs2Unix
@ ElliKagan saya mengerti. --regexdiperlukan karena ada terlalu banyak hasil yang dikembalikan dengan string pencarian saya. Saya akan menemukan dua contoh baru untuk menemukan dan menemukan dan memperbarui jawaban saya dalam beberapa menit.
WinEunuuchs2Unix
1
Untuk memperjelas poin Eliah, findperintah itu berarti "cetak nama file semua file di direktori /dan display-auto-brightness." Saya pikir Anda bermaksud menggunakan find / -name display-auto-brightness, tetapi bahkan yang mencetak banyak kesalahan "Izin ditolak" sampah.
wjandrea
@wjandrea Ya seperti yang saya katakan intinya bukan untuk menemukan file, itu untuk mengatur waktu perintah find. Saya menjalankan tes sekarang dengan parameter yang valid setelah pembilasan cache. Maka saya akan memperbarui jawabannya.
WinEunuuchs2Unix
1
@ Menang Tidak, contoh Anda masih valid, dan saya tidak berpikir waktu pemrosesan banyak berubah apakah file ditemukan atau tidak.
wjandrea