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 find
nã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 globstar
no bash e set -o globstar
no 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 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, o globbing recursivo está ativado por padrão. Use o qualificador glob D
para incluir arquivos de ponto e N
imprimir 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 printf
como acima ou
print -rl -- **/*.h(DN)
find
possui 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' -print
faz.