Ketika saya gunakan find --version
dengan GNU find, saya mendapatkan sesuatu seperti ini:
find (GNU findutils) 4.5.9
[license text]
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
Apa arti "fitur" ini? Ada beberapa referensi untuk O_NOFOLLOW
menjadi langkah pengamanan man find
, dan ada disebutkan LEAF_OPTIMISATION
menjadi optimasi yang menyimpan beberapa lstat
panggilan pada leaf leaf. Tetapi saya tidak dapat menemukan apa pun tentang FTS
, D_TYPE
atau CBO
.
Jawaban:
Ini adalah jawaban lengkap yang berasal dari jawaban Ketan dan daniel Kullman, serta penelitian saya sendiri.
Sebagian besar "fitur" berubah menjadi optimisasi kueri, karena
find
secara umum mampu (hampir) pertanyaan kompleks yang kompleks pada sistem file.D_TYPE
Kehadiran
D_TYPE
fitur berarti yangfind
dikompilasi dengan dukungan untukd_type
bidang dalamstruct dirent
. Bidang ini adalah ekstensi BSD yang juga diadopsi oleh Linux, yang menyediakan jenis file (direktori, file, pipa, soket, perangkat char / block, dll.) Dalam struktur yang dikembalikan darireaddir
dan teman-teman. Sebagai pengoptimalan,find
dapat menggunakan ini untuk mengurangi atau menghilangkanlstat
panggilan saat-type
digunakan sebagai ekspresi filter.readdir
mungkin tidak selalu terisid_type
pada beberapa sistem file, jadi terkadanglstat
masih diperlukan.Info lebih lanjut dari dokumentasi resmi: https://www.gnu.org/software/findutils/manual/html_node/find_html/d_005ftype-Optimisation.html
O_NOFOLLOW
Opsi ini akan membaca
(enabled)
atau(disabled)
. Jika ada dan diaktifkan, fitur ini mengimplementasikan tindakan keamanan yang melindungifind
dari serangan ras TOCTTOU tertentu. Secara khusus, itu mencegahfind
dari melintasi symlink saat melakukan direktori traversal, yang dapat terjadi jika direktori digantikan oleh symlink setelah filetype direktori diperiksa tetapi sebelum direktori dimasukkan.Dengan opsi ini diaktifkan,
find
akan digunakanopen(..., O_NOFOLLOW)
pada direktori untuk membuka hanya direktori nyata, kemudian gunakanopenat
untuk membuka file dalam direktori itu.LEAF_OPTIMISATION
Optimasi yang sedikit tidak jelas ini memungkinkan
find
untuk menyimpulkan subdirektori dari direktori induk mana yang merupakan direktori dengan menggunakan jumlah tautan dari direktori induk, karena subdirektori akan berkontribusi pada jumlah tautan induk (melalui..
tautan). Dalam keadaan tertentu, itu akan memungkinkanfind
untuk menghilangkanstat
panggilan. Namun, jika sistem file atau OS salah mengartikanst_nlinks
, hal itu dapat menyebabkanfind
hasil palsu (untungnya ini kejadian yang sangat jarang).Info lebih lanjut dalam dokumentasi resmi: https://www.gnu.org/software/findutils/manual/html_node/find_html/Leaf-Optimisation.html
FTS
Saat diaktifkan,
FTS
fitur menyebabkanfind
penggunaanfts
API untuk melintasi hierarki file, alih-alih implementasi rekursif lurus.Tidak jelas bagi saya apa keuntungannya
fts
, tetapiFTS
pada dasarnya adalah default pada semuafind
versi default yang saya lihat sejauh ini.Info lebih lanjut: https://www.gnu.org/software/findutils/manual/html_node/find_html/fts.html , http://man7.org/linux/man-pages/man3/fts.3.html
KSM
Ternyata (setelah membaca
find
kode sumber seperti yang disarankan oleh daniel kullman) bahwa "CBO" merujuk ke tingkat optimisasi kueri (singkatan dari "pengoptimal berbasis biaya"). Misalnya, jika saya melakukannyafind -O9001 --version
, saya mengertiMelihat
-O
opsi diman find
, saya melihatMisteri terpecahkan! Agak aneh bahwa opsinya adalah nilai runtime; biasanya saya akan mengharapkan
--version
output hanya untuk mencerminkan opsi waktu kompilasi.sumber
Informasi tentang
O_NOFOLLOW
diberikan diinfo
halamanfind
:Dari pohon sumber,
CBO
hanya terjadi di fileparser.c
:menunjukkannya sebagai optimasi berbasis biaya (tebakan terbaik saya).
D_TYPE
terjadi di beberapa tempat di source-tree dan sepertinya ada hubungannya dengan jenis entri direktori:Hasil:
dan beberapa entri lainnya. Anda dapat menemukan sumbernya di sini .
sumber
Ketika mencari melalui pohon sumber findutils ( http://git.savannah.gnu.org/cgit/findutils.git/tree/ ), saya menemukan yang berikut:
Saya tidak menemukan apa pun tentang CBO; Anda mungkin harus mengunduh kode sumber dan mencari istilah ..
sumber