Только zsh
имеет области, в которых вы можете выбирать файлы по типу, поэтому, предполагая, что GNU make
, вам понадобится что-то вроде:
SHELL = zsh
.SHELLFLAGS = -o extendedglob -c
test:
echo ^GNUmakefile(^/)
^ GNUmakefile
(с extendedglob
) предназначен для нескрытых файлов, кроме GNUmakefile
. (^ /)
- квалификатор glob , который выбирает файлы любого типа, кроме каталога. См. Также (.)
для файлов типа обычный (за исключением каталогов и всех других нестандартных типов файлов, таких как FIFO, символические ссылки, сокеты ...), которые больше похожи на то, что вы ищем. Добавьте квалификатор glob D
( ^ GNUmakefile (.D)
), чтобы включить скрытые ( D ot) файлы, такие как .gitignore
.
Обратите внимание, что * [^ GNUmakefile *]
расширяется до списка имен нескрытых файлов, которые заканчиваются символом, отличным от G
, N
, U
, m
, a
, k
, e
, f
, ] i
, l
или *
. Таким образом, он действительно исключит GNUmakefile
(поскольку он заканчивается на e
), но также foo.a
или file.html
или ] bar.exe
.
Чтобы сделать то же самое без изменения оболочки, вам нужно прибегнуть к циклу вроде (здесь эквивалент ^ GNUmakefile (.)
):
test:
set -- *; \
for i do \
[ -f "$$i" ] && \
[ ! -L "$$i" ] && \
[ "$$i" != GNUmakefile ] && \
set -- "$$@" "$$i"; \
shift; \
done; \
[ "$$#" -gt 0 ] && echo "$$@"
(replace set - *
с установленным -. * *
для включения скрытых файлов).
Лучше всего было бы прибегнуть к find
вместо команд оболочки, если вы не можете гарантировать доступность zsh
:
test:
find . ! -name . -prune ! -name '.*' ! -name GNUmakefile \
-type f -exec echo {} +
find TestData/. ! -name . -prune -name '*.dat' ! -name '.*' \
-type f -exec echo {} +
(remove ! -Name ' . * '
для включения скрытых файлов).
Использование touch -a /usr/bin/*
приведет к появлению списка только Input/output error
имен файлов в stderr
.