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)