Как пропустить каталог в awk?

Скажем, у меня есть следующая структура файлов и каталогов:

$ tree
.
├── a
├── b
└── dir
    └── c

1 directory, 3 files

То есть два файлаa а такжеb вместе с режиссеромdirгде другой файлc стоит.

Я хочу обработать все файлы сawk (GNU Awk 4.1.1именно так), поэтому я делаю что-то вроде этого:

$ gawk '{print FILENAME; nextfile}' * */*
a
b
awk: cmd. line:1: warning: command line argument `dir' is a directory: skipped
dir/c

Все хорошо но* также расширяется в каталогdir а такжеawk пытается обработать это.

Вот и мне интересно: есть ли какой-то родной способawk Можно ли проверить, является ли данный элемент файлом или нет, и если да, пропустить его? То есть без использованияsystem() для этого.

Я сделал это, позвонив по внешнемуsystem вBEGINFILE:

$ gawk 'BEGINFILE{print FILENAME; if (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}} ENDFILE{print FILENAME, FNR}' * */*
a
a 10
a.wk
a.wk 3
b
b 10
dir
dir is a dir, skipping
dir/c
dir/c 10

Обратите внимание также на тот факт, чтоif (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile} работает счетчик интуитивно: он должен возвращать 1, когда истина, но он возвращает код выхода.

Я читаю вA.5 Расширения в gawk Не в POSIX awk:

Каталоги в командной строке выдают предупреждение и пропускаются (см.Каталоги командной строки)

И тогда на связанной странице написано:

4.11. Каталоги в командной строке

Согласно стандарту POSIX, файлы, названные в командной строке awk, должны быть текстовыми; это фатальная ошибка, если нет. Большинство версий awk рассматривают каталог в командной строке как фатальную ошибку.

По умолчанию gawk выдает предупреждение для каталога в командной строке, но в противном случае игнорирует его. Это облегчает использование подстановочных знаков оболочки с вашей программой awk:

$ gawk -f whizprog.awk *        Directories could kill this program

Если указан один из параметров --posix или --traditional, то gawk возвращается к обработке каталога в командной строке как к фатальной ошибке.

УвидетьОбразец расширения Readdir, для способа обработки каталогов как полезных данных из программы awk.

И на самом деле это так: та же команда, что и раньше с--posix терпит неудачу:

$ gawk --posix 'BEGINFILE{print FILENAME; if (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}} ENDFILE{print FILENAME, NR}' * */*
gawk: cmd. line:1: fatal: cannot open file `dir' for reading (Is a directory)

Я проверил16.7.6 Reading Directories раздел, который связан выше, и они говорят оreaddir:

Расширение readdir добавляет входной анализатор для каталогов. Использование заключается в следующем:

@load "readdir"

Но я не уверен ни как назвать это, ни как использовать это из командной строки.