O ?
faz parte de um mecanismo chamado "expansão do nome do caminho" no shell .
Coloquialmente, o mecanismo de shell é chamado de "globing". O glob básico usa apenas três caracteres: *
?
e [
que criam "padrões".
Um asterisco *
significa:
- Qualquer caractere em qualquer quantidade (qualquer string).
Um ponto de interrogação ( ?
) significa:
- Qualquer caractere uma vez .
As chaves quadradas definem uma lista de caracteres [ ]
e significam:
- Apenas os caracteres dentro da lista são contados uma vez. Pode haver listas negadas.
Esses caracteres são usados de maneira semelhante no comando find . Em encontrar, eles são chamados de "padrões".
Isso significa que existem duas entidades usando os mesmos caracteres para executar a mesma tarefa (globing). É preciso dizer a alguém para ignorar esses personagens. A maneira usual de dizer ao shell para evitar a interpretação de caracteres especiais é "citá-los". Com "aspas simples", "aspas duplas" ou com uma barra invertida:
'?'
"?"
\?
É por isso que os "padrões" para find
são citados:
find /path/foo -name \?
O que essa linha significa é:
Listar todos os arquivos e diretórios a partir do diretório /path/foo
que tem um nome com apenas um caractere de largura.
sobre /
Observe isso? na expansão de padrão do find pode corresponder a /
.
Um pattern
em encontrar pode corresponder a /
conforme especificado pelo POSIX dentro dos operandos seção para o comando find :
-path pattern The primary shall evaluate as true if the current pathname matches pattern using the pattern matching notation described in Pattern Matching Notation. The additional rules in Patterns Used for Filename Expansion do not apply as this is a matching operation, not an expansion.
Novamente: regras adicionais ... para Expansão de nome de arquivo (como em um shell) não se aplicam, pois essa é uma operação de correspondência, não uma expansão.
Para mostrar que isso é verdade:
$ mkdir test; cd test
$ mkdir -p a/b/c/d
$ find a -path 'a?b'
a/b
$ find . -path './a?b?c?d'
./a/b/c/d
É claro que a opção -name
de find corresponderá ao basename de um arquivo. Isso, por definição, não poderia ter um /
, pois não é possível corresponder um /
em um nome de base.