Em geral, a cadeia vazia não indica o diretório atual, nem para shell comandos nem nas chamadas do sistema. Isso ocorreu 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 passa uma string vazia e o programa espera um nome de diretório. Isso às vezes é deliberado e, às vezes, um efeito colateral de preceder o caminho absoluto do diretório atual quando a sequência especificada não inicia 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 controla alguns nomes de arquivos que contêm novas linhas. Isso geralmente não é um problema para o consumo humano, e a saída de findnão é adequada para o consumo do programa, pois é ambígua. Se você estiver usando -print0, o que é adequado para o consumo do programa, provavelmente não se importa com o ./prefixo.
Você pode usar em find * …vez de find . …, mas observe que find *há vários defeitos que o tornam inadequado em geral:
. é 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 comece 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 precisará verificar se cada padrão corresponde a pelo menos um arquivo e omitir se não corresponder. Isso é possível, mas muito complicado. O último ponto é uma rolha. Portanto, find *pode ser adequado para o uso rápido da linha de comando, mas não o use em um script.
Uma abordagem alternativa é usar o recurso de globbing recursivo da concha, por exemplo
printf '%s\n' **/*.h
Isso precisa ser ativado shopt -s globstarno bash e set -o globstarno ksh93 e não existe em um shell POSIX básico, como o dash. Arquivos de ponto não serão percorridos por padrão; Para incluí-los, faça com que o globbing não ignore os arquivos de ponto shopt -s dotglobno bash ou FIGNORE='@(.|..)'no ksh93. Além disso, se não houver correspondências, esse comando imprime o padrão; execute shopt -s nullglobno bash para imprimir uma linha vazia e use o padrão ~(N)**/*.hno ksh.
No zsh, o globbing recursivo está ativado por padrão. Use o qualificador glob Dpara incluir arquivos de ponto e Nimprimir uma linha vazia se não houver correspondências (por padrão, o zsh gera um erro se um padrão não corresponder a nenhum arquivo). Você pode usar printfcomo acima ou
print -rl -- **/*.h(DN)
findpossui o parâmetro -printf para manipular como os resultados são mostrados.find . -name '*.h' -printf '%P\n'irá remover o./prefixo. Veja o quefind . -name '*.h' -printfaz.