Wie überspringe ich ein Verzeichnis in awk?

Say Ich habe die folgende Struktur von Dateien und Verzeichnissen:

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

1 directory, 3 files

Das heißt, zwei Dateiena undb zusammen mit einem dirdir, wo eine andere Dateic steht

Ich möchte alle Dateien mit @ verarbeitawk (GNU Awk 4.1.1, genau), also mache ich so etwas:

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

lles ist in Ordnung, aber das* erweitert auch das Verzeichnisdir undawk versucht es zu verarbeiten.

So frage ich mich: gibt es einen nativen Wegawk kann prüfen, ob das angegebene Element eine Datei ist oder nicht und wenn ja, überspringen? Das heißt, ohnesystem() dafür

Ich habe es zum Laufen gebracht, indem ich das externe @ aufgerufen hasystem im 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

Beachten Sie auch die Tatsache, dassif (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile} funktioniert intuitiv: Es sollte 1 zurückgeben, wenn es true ist, aber es gibt den Exit-Code zurück.

Ich lese in A.5 Erweiterungen in gawk Nicht in POSIX awk:

Directories in der Befehlszeile erzeugen eine Warnung und werden übersprungen (siehe Befehlszeilenverzeichnisse)

Und dann heißt es auf der verlinkten Seite:

4.11 Verzeichnisse in der Befehlszeile

Nach dem POSIX-Standard müssen die in der awk-Befehlszeile genannten Dateien Textdateien sein. Es ist ein schwerwiegender Fehler, wenn dies nicht der Fall ist. Die meisten Versionen von awk behandeln ein Verzeichnis in der Befehlszeile als schwerwiegenden Fehler.

Standardmäßig gibt gawk eine Warnung für ein Verzeichnis in der Befehlszeile aus, ignoriert sie jedoch ansonsten. Dies erleichtert die Verwendung von Shell-Platzhaltern in Ihrem awk-Programm:

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

Wenn eine der Optionen --posix oder --traditional angegeben wird, behandelt gawk ein Verzeichnis in der Befehlszeile wieder als schwerwiegenden Fehler.

SehenExtension Sample Readdir, um Verzeichnisse als verwendbare Daten aus einem awk-Programm zu behandeln.

Und tatsächlich ist es so: der gleiche Befehl wie zuvor mit--posix schlägt fehl:

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

Ich habe das @ überprü16.7.6 Reading Directories Abschnitt, der oben verlinkt ist und sie reden überreaddir:

Die readdir-Erweiterung fügt einen Eingabe-Parser für Verzeichnisse hinzu. Die Verwendung ist wie folgt:

@ load "readdir"

Aber ich bin mir nicht sicher, wie ich es aufrufen oder wie ich es von der Kommandozeile aus verwenden soll.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage