Dire che ho la seguente struttura di file e directory:Come saltare una directory in awk?
$ tree
.
├── a
├── b
└── dir
└── c
1 directory, 3 files
Cioè, due file a
e b
insieme ad un dir dir
, dove un altro file c
stand.
voglio elaborare tutti i file con awk
(GNU Awk 4.1.1
, appunto), così faccio qualcosa di simile:
$ gawk '{print FILENAME; nextfile}' * */*
a
b
awk: cmd. line:1: warning: command line argument `dir' is a directory: skipped
dir/c
Tutto è bene, ma il *
si espande anche alla directory dir
e awk
tenta di elaborare esso.
Quindi mi chiedo: c'è un modo nativo awk
possibile controllare se l'elemento dato è un file o meno e, in caso affermativo, saltarlo? Cioè, senza usare system()
per questo.
mi ha reso il lavoro chiamando l'esterno system
in 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
nota anche il fatto che if (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}
funziona contatore intuitivo: dovrebbe restituire 1 se vero, ma restituisce il codice di uscita.
ho letto in A.5 Extensions in gawk Not in POSIX awk:
- directory nella riga di comando produrre un avvertimento e vengono saltati (vedi Command-line directories)
E poi la pagina collegata dice:
4.11 Directories sul Riga di comando
In base allo standard POSIX, i file denominati nella riga di comando awk devono essere file di testo; è un errore fatale se non lo sono. La maggior parte delle versioni di awk trattano una directory sulla riga di comando come un errore fatale.
Per impostazione predefinita, gawk genera un avviso per una directory sul comando riga, ma in caso contrario lo ignora. Questo rende più facile da usare guscio jolly con il vostro programma awk:
$ gawk -f whizprog.awk * Directories could kill this program
Se uno dei --posix o --traditional opzioni è dato, quindi gawk ritorna a trattare una directory sulla riga di comando come errore fatale.
Vedere Extension Sample Readdir, per un modo di trattare le directory come dati utilizzabili da un programma awk.
E in effetti è il caso: lo stesso comando di prima con --posix
fallisce:
$ 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)
ho controllato la sezione 16.7.6 Reading Directories
che è legata sopra e si parla di readdir
:
L'estensione readdir aggiunge un parser di input per le directory. L'utilizzo è il seguente:
@load "readdir"
Ma io non sono sicuro né come chiamare esso, né come usarla dalla riga di comando.
Niiiice! Quindi 'getline' su una directory non fallisce direttamente ma può essere gestito. – fedorqui
RIght. Quando ho letto per la prima volta la tua domanda ho pensato che stavi cercando di usare awk per cercare file/dirs (mi dispiace - breve intervallo di attenzione!) Ma rileggendo sembra che tu voglia solo salvaguardare qualcuno che chiama lo script con un file non args: non c'è niente di sbagliato nel farlo e soprattutto è come lo si fa. Ho aggiornato la mia risposta per essere un po 'più favorevole a questo! –
Sì, esattamente. Serve solo a prevenire avvertimenti, o persino codici di uscita, a causa del fatto che una dir viene espansa in una lista presumibilmente di solo file. Risposta molto interessante da cui ho imparato parecchio, grazie:) – fedorqui