Quando uso find --version
com o GNU find, recebo algo assim:
find (GNU findutils) 4.5.9
[license text]
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
O que esses "recursos" significam? Há alguma referência a O_NOFOLLOW
ser uma medida de segurança man find
e há uma menção de LEAF_OPTIMISATION
uma otimização que salva algumas lstat
chamadas em nós de folha. Mas não consigo encontrar nada sobre FTS
, D_TYPE
ou CBO
.
Respostas:
Esta é uma resposta completa derivada das respostas de Ketan e Daniel Kullman, bem como de minha própria pesquisa.
A maioria dos "recursos" acaba sendo otimizações de consulta, pois
find
geralmente é capaz de (quase) consultas arbitrariamente complexas no sistema de arquivos.D_TYPE
A presença do
D_TYPE
recurso significa quefind
foi compilado com suporte para od_type
campo emstruct dirent
. Este campo é uma extensão BSD também adotada pelo Linux, que fornece o tipo de arquivo (diretório, arquivo, pipe, soquete, dispositivo char / block, etc.) na estrutura retornada porreaddir
e amigos. Como otimização, vocêfind
pode usar isso para reduzir ou eliminarlstat
chamadas quando-type
é usada como uma expressão de filtro.readdir
nem sempre pode ser preenchidod_type
em alguns sistemas de arquivos; portanto, algumas vezeslstat
ainda será necessário.Mais informações da documentação oficial: https://www.gnu.org/software/findutils/manual/html_node/find_html/d_005ftype-Optimisation.html
O_NOFOLLOW
Esta opção lerá
(enabled)
ou(disabled)
. Se presente e ativado, esse recurso implementa uma medida de segurança que protegefind
de determinados ataques de corrida do TOCTTOU. Especificamente, impede afind
passagem de um link simbólico durante a passagem do diretório, o que poderia ocorrer se o diretório fosse substituído por um link simbólico após a verificação do tipo de arquivo do diretório, mas antes da inserção do diretório.Com essa opção ativada,
find
será usadoopen(..., O_NOFOLLOW)
no diretório para abrir apenas diretórios reais e, em seguida, será usadoopenat
para abrir arquivos nesse diretório.LEAF_OPTIMISATION
Essa otimização ligeiramente obscura permite
find
deduzir quais subdiretórios de um diretório pai são diretórios usando a contagem de links do diretório pai, pois os subdiretórios contribuirão para a contagem de links do pai (via..
link). Em certas circunstâncias, permitiráfind
cancelar umastat
chamada. No entanto, se o sistema de arquivos ou o SO apresentar uma representação incorretast_nlinks
, poderá causarfind
resultados falsos (felizmente, é uma ocorrência muito rara).Mais informações na documentação oficial: https://www.gnu.org/software/findutils/manual/html_node/find_html/Leaf-Optimisation.html
STF
Quando ativado, o
FTS
recurso fazfind
com que afts
API use a hierarquia de arquivos, em vez de uma implementação recursiva direta.Não está claro para mim qual é a vantagem
fts
, masFTS
é basicamente o padrão em todas asfind
versões padrão que vi até agora.Mais informações: https://www.gnu.org/software/findutils/manual/html_node/find_html/fts.html , http://man7.org/linux/man-pages/man3/fts.3.html
CBO
Acontece (depois de ler o
find
código-fonte sugerido por daniel kullman) que "CBO" se refere ao nível de otimização de consulta (significa "otimizador baseado em custo"). Por exemplo, se eu fizerfind -O9001 --version
, eu receboOlhando para a
-O
opçãoman find
, vejoMistério resolvido! É um pouco estranho que a opção seja um valor de tempo de execução; normalmente, eu esperaria que a
--version
saída refletisse apenas as opções em tempo de compilação.fonte
As informações
O_NOFOLLOW
são fornecidas nainfo
página defind
:Na árvore de origem,
CBO
ocorre apenas no arquivoparser.c
:indicando que é otimização baseada em custos (meu melhor palpite).
D_TYPE
ocorre em vários locais na árvore de origem e parece ter a ver com o tipo de entrada do diretório:Rendimentos:
e mais algumas entradas. Você pode encontrar a fonte aqui .
fonte
Ao examinar a árvore de fontes findutils ( http://git.savannah.gnu.org/cgit/findutils.git/tree/ ), encontrei o seguinte:
Não encontrei nada sobre a CBO; pode ser necessário fazer o download do código-fonte e procurar o termo.
fonte