Как пропустить каталог в 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"
Но я не уверен ни как назвать это, ни как использовать это из командной строки.