Apenas zsh tem globs onde você pode selecionar arquivos por tipo, portanto, assumindo o GNU make , você precisa de algo como:
SHELL = zsh
.SHELLFLAGS = -o extendedglob -c
test:
echo ^GNUmakefile(^/)
^GNUmakefile (com extendedglob ) é para arquivos não ocultos diferentes de GNUmakefile . (^/) é um qualificador glob que seleciona arquivos de qualquer tipo diferente de diretório. Veja também (.) para arquivos do tipo regular (exclui diretórios e todos os outros tipos não regulares de arquivos como fifos, symlinks, sockets ...) que parecem mais com o que você está procurando. Adicione o qualificador D glob ( ^GNUmakefile(.D) ) para incluir arquivos ocultos ( D ot) como .gitignore .
Observe que *[^GNUmakefile*] é expandido para a lista de nomes de arquivos não ocultos que terminam em um caractere diferente de G , N , U , m , a , k , e , f , i , l ou * . Então, de fato, excluirá GNUmakefile (já que termina em e ), mas também foo.a ou file.html ou bar.exe .
Para fazer o mesmo sem alterar o shell, você precisaria recorrer a um loop como (aqui para o equivalente de ^GNUmakefile(.) ):
test:
set -- *; \
for i do \
[ -f "$$i" ] && \
[ ! -L "$$i" ] && \
[ "$$i" != GNUmakefile ] && \
set -- "$$@" "$$i"; \
shift; \
done; \
[ "$$#" -gt 0 ] && echo "$$@"
(substitua set -- * por set -- .* * para incluir arquivos ocultos).
Melhor provavelmente seria recorrer a find em vez de shell globs se você não puder garantir a disponibilidade de zsh :
test:
find . ! -name . -prune ! -name '.*' ! -name GNUmakefile \
-type f -exec echo {} +
find TestData/. ! -name . -prune -name '*.dat' ! -name '.*' \
-type f -exec echo {} +
(remova ! -name '.*' para incluir arquivos ocultos).