Em geral, a string vazia não denota o diretório atual, nem os comandos do shell nem as chamadas do sistema. Funcionou em alguns sistemas mais antigos, mas não em sistemas compatíveis com POSIX .
Ocasionalmente, você encontrará um programa que usa o diretório atual quando você passa uma string vazia e o programa espera um nome de diretório. Às vezes, isso é deliberado e, às vezes, um efeito colateral de prefixar o caminho absoluto do diretório atual quando a string fornecida não é iniciada com uma barra.
A melhor coisa para você seria deixar o ./
. Não faz mal nenhum.
Se a lista de arquivos for para
find . … | sed 's!^\./!!'
Observe que isso prejudica alguns nomes de arquivos que contêm novas linhas. Isso geralmente não é um problema para consumo humano, e a saída de find
não é adequada para consumo de programas, pois é ambígua. Se você estiver usando -print0
, o que é adequado para o consumo do programa, provavelmente você não se importa com o prefixo ./
.
Você pode usar find * …
em vez de find . …
, mas observe que find *
tem vários defeitos que o tornam inadequado em geral:
-
.
foi omitido.
- Todos os arquivos de ponto (arquivos cujo nome começa com
.
ou .. ') são omitidos.
- Se houver um nome de arquivo no diretório atual cujo nome começa com
-
(ou um arquivo chamado !
ou (
...), ele será interpretado como uma opção ou predicado por find
.
O primeiro ponto não importa se o seu filtro exclui o diretório atual. Para o segundo ponto, você pode usar os padrões ..?* .[!.]* *
para corresponder a todos os arquivos no diretório atual, mas será necessário verificar se cada padrão corresponde a pelo menos um arquivo e omitir se não for o caso. Isso é possível, mas muito complicado. O último ponto é uma rolha. Portanto, find *
pode ser adequado para o uso de linha de comando rápida, mas não use em um script.
Uma abordagem alternativa é usar o recurso de globalização recursiva do shell, por exemplo
printf '%s\n' **/*.h
Isso precisa ser ativado por shopt -s globstar
no bash e por set -o globstar
no ksh93, e não existe em um shell POSIX básico como o dash. Os arquivos Dot não serão percorridos por padrão; para incluí-los, primeiro fazer globbing não ignorar arquivos de ponto com shopt -s dotglob
no bash ou FIGNORE='@(.|..)'
no ksh93. Além disso, se não houver correspondências, esse comando imprime o padrão; execute shopt -s nullglob
no bash para imprimir uma linha vazia e use o padrão ~(N)**/*.h
no ksh.
No zsh, a globalização recursiva está ativada por padrão. Use o qualificador glob D
para incluir arquivos de ponto e N
para imprimir uma linha vazia se não houver correspondências (por padrão, zsh lançará um erro se um padrão não corresponder a nenhum arquivo). Você pode usar printf
como acima ou
print -rl -- **/*.h(DN)