A página de manual citada para getdents é específica do Linux e não se aplica para todos os tipos de sistema de arquivos (por exemplo, a página de manual não menciona procfs
ou nfs
), enquanto o GNU encontrar não é específico da plataforma (sua página de manual menciona o SELinux, que é sem dúvida um recurso útil a ser levado em conta). Ele poderia ser otimizado para este caso especial também.
Mesmo que o recurso esteja disponível, a página de manual recomenda:
All applications must properly handle a return of DT_UNKNOWN
.
Ou seja, as informações, se disponíveis, podem ser úteis, mas não é garantido que estejam presentes.
Com todos esses inconvenientes, os desenvolvedores de find
talvez não percebam a necessidade dessa otimização. Um usuário motivado pode se aprofundar no código-fonte para ver como fazer isso e propor uma alteração ifdef adequada.
@Nate Eldredge observa que alguém começou nessa direção. O manual find
indica 7.2 d_type Optimization
When this feature is enabled, find takes advantage of the fact that on some systems readdir will return the type of a file in struct dirent.
O recurso foi mencionado pela primeira vez em
2005-01-17 James Youngman <[email protected]>
* configure.in, find/defs.h, find/find.c, find/parser.c, find/pred.c, find/tree.c, find/util.c:
Implemented d_type optimisation but not working correctly, so currently disabled
Mais tarde, foi revisado para usar o gnulib para suportar isso:
2010-04-08 James Youngman <[email protected]>
Adopt the use of the gnulib module d-type.
* import-gnulib.config (modules): Import the d-type module.
* configure.ac: Remove old struct dirent.d_type detection logic
(since we now use the gnulib macro from the d-type module for
this).
A versão 4.2.2 é bastante antiga (talvez um erro de digitação), a propósito: 4.2.3 data de 2004, e é anterior a estas entradas do changelog. A tag de lançamento atual no git é 4.5.14 (mid -2014).
Independentemente do status de uma otimização d_type
, os desenvolvedores estão interessados em reduzir o número de chamadas para stat
. Uma nota de 4.5.4 (2009-03-10) diz por exemplo:
The ftsfind executable also now avoids calling stat() functions to
discover the inode number of a file, if we already read this
information from the directory. This does provide a speed-up, but
only for a restricted set of commands such as "find . -inum 4001".
This fix is listed below as bug #24342.
Em resumo: OP perguntou
Why need to for stat regardless of -L, -H or whatever options.
O motivo é que é um caso especial que é problemático fazer com que ele funcione perfeitamente em vez de stat
em todos os cenários em que find
pode precisar disso e que leva tempo para isso.