Когда я использую find --version
с GNU find, я получаю что-то вроде этого:
find (GNU findutils) 4.5.9
[license text]
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
Что означают эти «особенности»? Есть некоторая ссылка на O_NOFOLLOW
то, чтобы быть мерой безопасности man find
, и есть упоминание LEAF_OPTIMISATION
об оптимизации, которая экономит несколько lstat
вызовов на конечных узлах. Но я не могу найти ничего о FTS
, D_TYPE
или CBO
.
Ответы:
Это полный ответ, полученный из ответов Кетана и Даниэля Куллмана, а также из моих собственных исследований.
Большая часть «функций» оказывается оптимизацией запросов, поскольку
find
в целом способна (почти) произвольно усложнять запросы в файловой системе.D_TYPE
Наличие
D_TYPE
функции означает, чтоfind
было скомпилировано с поддержкойd_type
поля вstruct dirent
. Это поле является расширением BSD, также принятым в Linux, которое предоставляет тип файла (каталог, файл, канал, сокет, устройство char / block и т. Д.) В структуре, возвращаемой отreaddir
друзей. В качестве оптимизацииfind
можно использовать это для уменьшения или исключенияlstat
вызовов, когда-type
используется в качестве выражения фильтра.readdir
может не всегда заполнятьd_type
некоторые файловые системы, поэтому иногдаlstat
они все равно будут необходимы.Дополнительная информация из официальной документации: https://www.gnu.org/software/findutils/manual/html_node/find_html/d_005ftype-Optimisation.html.
O_NOFOLLOW
Эта опция будет читать
(enabled)
или(disabled)
. Если эта функция присутствует и включена, она реализует меру безопасности, которая защищаетfind
от определенных гонок TOCTTOU. В частности, он предотвращаетfind
обход символической ссылки при выполнении обхода каталога, что может произойти, если каталог был заменен символической ссылкой после проверки типа файла каталога, но до того, как каталог был введен.Если эта опция включена,
find
будет использоватьopen(..., O_NOFOLLOW)
каталог для открытия только реальных каталогов, а затем использоватьopenat
для открытия файлов в этом каталоге.LEAF_OPTIMISATION
Эта немного неясная оптимизация позволяет
find
определить, какие подкаталоги родительского каталога являются каталогами, используя счетчик ссылок родительского каталога, поскольку подкаталоги будут вносить вклад в счетчик ссылок родительского каталога (через..
ссылку). В определенных обстоятельствах это позволитfind
отказаться отstat
вызова. Однако, если файловая система или операционная система искажают данныеst_nlinks
, это может привестиfind
к ложным результатам (к счастью, это очень редкое явление).Более подробная информация в официальной документации: https://www.gnu.org/software/findutils/manual/html_node/find_html/Leaf-Optimisation.html.
FTS
При включении эта
FTS
функция заставляетfind
использоватьfts
API для обхода файловой иерархии вместо прямой рекурсивной реализации.Мне не ясно, в чем преимущество
fts
, ноFTS
в основном это стандартное значение во всехfind
версиях по умолчанию, которые я видел до сих пор.Дополнительная информация: https://www.gnu.org/software/findutils/manual/html_node/find_html/fts.html , http://man7.org/linux/man-pages/man3/fts.3.html.
СВО
Оказывается (после прочтения
find
исходного кода, как предложил Даниэль Куллман), что «CBO» относится к уровню оптимизации запросов (он означает «оптимизатор на основе затрат»). Например, если я делаюfind -O9001 --version
, я получаюГлядя на
-O
вариант вman find
, я вижуТайна разгадана! Немного странно, что опция является значением времени выполнения; обычно я ожидаю, что
--version
выходные данные будут отражать только параметры времени компиляции.источник
Информация о размещена
O_NOFOLLOW
наinfo
страницеfind
:Из исходного дерева
CBO
встречается только в файлеparser.c
:указав, что это оптимизация на основе затрат (моя лучшая догадка).
D_TYPE
встречается в нескольких местах дерева исходных текстов и, похоже, связано с типом записи каталога:Урожайность:
и еще несколько записей. Вы можете найти источник здесь .
источник
Просматривая дерево исходников findutils ( http://git.savannah.gnu.org/cgit/findutils.git/tree/ ), я обнаружил следующее:
Я не нашел ничего о CBO; вам, возможно, придется скачать исходный код и найти термин ..
источник