Isso é uma pegadinha realmente boa. De uma rápida olhada no código-fonte do GNU find, eu diria que isso se resume a como fnmatch
se comporta em seqüências de bytes inválidos ( pred_name_common
in pred.c
):
b = fnmatch (str, base, flags) == 0;
(...)
return b;
Este código testa o valor de retorno de fnmatch
para igualdade com 0, mas não verifica erros; Isso resulta em qualquer erro sendo relatado como "não corresponde".
Foi sugerido, há muitos anos atrás, alterar o comportamento dessa função libc para sempre retornar true no padrão *
, mesmo em nomes de arquivos quebrados, mas pelo que eu posso dizer a ideia deve ter sido rejeitada ( veja o tópico que começa no link ):
When fnmatch detects an invalid multibyte character it should fall back to single byte matching, so that "*" has a chance to match such a string.
E por que isso é melhor ou mais correto? Existe prática?
Como mencionado por Stéphane Chazelas em um comentário, e também no mesmo tópico de 2002, isso é inconsistente com a expansão glob realizada por shells, que não se engasgam com caracteres inválidos. Talvez ainda mais intrigante seja o fato de que a reversão do teste corresponderá apenas aos arquivos que tiverem nomes quebrados (crie arquivos no bash com touch $'D1marrer' $'Touch31' $'675644026'
):
$ find -name '*'
.
./Touché
./日本語
$ find -not -name '*'
./D?marrer
Assim, para responder à sua pergunta, você poderia ter previsto isso sabendo o comportamento de seu fnmatch
neste caso, e sabendo como find
manipula o valor de retorno dessa função; você provavelmente não poderia ter descoberto apenas lendo a documentação.