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).