¿Cómo omitir un directorio en awk?

Digamos que tengo la siguiente estructura de archivos y directorios:

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

1 directory, 3 files

Es decir, dos archivos.a yb junto con un dirdir, donde otro archivoc soportes

Quiero procesar todos los archivos conawk (GNU Awk 4.1.1, exactamente), así que hago algo como esto:

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

Todo está bien pero el* también se expande al directoriodir yawk intenta procesarlo

Entonces me pregunto: ¿hay alguna forma nativa?awk puede verificar si el elemento dado es un archivo o no y, en caso afirmativo, omitirlo? Es decir, sin usarsystem() para ello.

Lo hice funcionar llamando al externosystem enCOMIENZA EL ARCHIVO:

$ 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

Tenga en cuenta también el hecho de queif (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile} funciona de manera intuitiva: debe devolver 1 cuando es verdadero, pero devuelve el código de salida.

Yo leo enA.5 Extensiones en gawk No en POSIX awk:

Los directorios en la línea de comando producen una advertencia y se omiten (consulteDirectorios de línea de comando)

Y luego la página vinculada dice:

4.11 Directorios en la línea de comando

Según el estándar POSIX, los archivos nombrados en la línea de comando awk deben ser archivos de texto; Es un error fatal si no lo son. La mayoría de las versiones de awk tratan un directorio en la línea de comando como un error fatal.

Por defecto, gawk genera una advertencia para un directorio en la línea de comando, pero de lo contrario lo ignora. Esto facilita el uso de comodines de shell con su programa awk:

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

Si se da cualquiera de las opciones --posix o --traditional, entonces gawk vuelve a tratar un directorio en la línea de comando como un error fatal.

VerExtensión de muestra Readdir, para una forma de tratar los directorios como datos utilizables de un programa awk.

Y de hecho es el caso: el mismo comando que antes con--posix falla:

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

Revisé el16.7.6 Reading Directories sección que está vinculada anteriormente y hablan dereaddir:

La extensión readdir agrega un analizador de entrada para directorios. El uso es el siguiente:

@load "readdir"

Pero no estoy seguro de cómo llamarlo ni cómo usarlo desde la línea de comandos.

Respuestas a la pregunta(2)

Su respuesta a la pregunta