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 yang find
dikompilasi dengan dukungan untuk d_type
bidang dalam struct 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 dari readdir
dan teman-teman. Sebagai pengoptimalan, find
dapat menggunakan ini untuk mengurangi atau menghilangkan lstat
panggilan saat -type
digunakan sebagai ekspresi filter.
readdir
mungkin tidak selalu terisi d_type
pada beberapa sistem file, jadi terkadang lstat
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 melindungi find
dari serangan ras TOCTTOU tertentu. Secara khusus, itu mencegah find
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 digunakan open(..., O_NOFOLLOW)
pada direktori untuk membuka hanya direktori nyata, kemudian gunakan openat
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 memungkinkan find
untuk menghilangkan stat
panggilan. Namun, jika sistem file atau OS salah mengartikan st_nlinks
, hal itu dapat menyebabkan find
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 menyebabkan find
penggunaan fts
API untuk melintasi hierarki file, alih-alih implementasi rekursif lurus.
Tidak jelas bagi saya apa keuntungannya fts
, tetapi FTS
pada dasarnya adalah default pada semua find
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 melakukannya find -O9001 --version
, saya mengerti
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=9001)
Melihat -O
opsi di man find
, saya melihat
-Olevel
Enables query optimisation. The find program reorders tests to speed up execution while preserving the overall
effect; that is, predicates with side effects are not reordered relative to each other. The optimisations performed
at each optimisation level are as follows.
0 Equivalent to optimisation level 1.
1 This is the default optimisation level and corresponds to the traditional behaviour. Expressions are
reordered so that tests based only on the names of files (for example -name and -regex) are performed first.
2 Any -type or -xtype tests are performed after any tests based only on the names of files, but before any
tests that require information from the inode. On many modern versions of Unix, file types are returned by
readdir() and so these predicates are faster to evaluate than predicates which need to stat the file first.
3 At this optimisation level, the full cost-based query optimiser is enabled. The order of tests is modified
so that cheap (i.e. fast) tests are performed first and more expensive ones are performed later, if neces-
sary. Within each cost band, predicates are evaluated earlier or later according to whether they are likely
to succeed or not. For -o, predicates which are likely to succeed are evaluated earlier, and for -a, predi-
cates which are likely to fail are evaluated earlier.
The cost-based optimiser has a fixed idea of how likely any given test is to succeed. In some cases the probability
takes account of the specific nature of the test (for example, -type f is assumed to be more likely to succeed than
-type c). The cost-based optimiser is currently being evaluated. If it does not actually improve the performance
of find, it will be removed again. Conversely, optimisations that prove to be reliable, robust and effective may be
enabled at lower optimisation levels over time. However, the default behaviour (i.e. optimisation level 1) will not
be changed in the 4.3.x release series. The findutils test suite runs all the tests on find at each optimisation
level and ensures that the result is the same.
Misteri terpecahkan! Agak aneh bahwa opsinya adalah nilai runtime; biasanya saya akan mengharapkan --version
output hanya untuk mencerminkan opsi waktu kompilasi.