per incidenti globali


10

Sto cercando di impostare uno script che eseguirà il ciclo su una serie di directory e fare una cosa quando trova i file .jpg e un'altra quando trova i file .nef. Il problema è che se una directory non ha file .jpg, ad esempio (o .nef), la voce glob non è più un glob espanso, ma solo una stringa. Per esempio:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

se la cartella my_dir contiene file .JPG, verranno echo correttamente nella riga di comando.

pictures/one.JPG
pictures/two.JPG

Tuttavia, se my_dir non ha file .JPG, il ciclo entrerà per un'iterazione ed eco:

pictures/*.JPG

come lo costruisco in modo che se il glob non ha corrispondenze, non entri nel ciclo for?

Risposte:


17

Questo è un comportamento normale e predefinito: se il globbing non riesce ad abbinare alcun file / directory, il carattere globbing originale verrà preservato.

Se vuoi invece ottenere un risultato vuoto, puoi impostare l' nullglobopzione nel tuo script come segue:

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

Puoi disabilitarlo in seguito con:

$ shopt -u nullglob

6

Facendo un passo un po 'di lato, usare qui findpotrebbe anche essere utile se il comando che stai eseguendo per i file è abbastanza semplice da rilasciare su una riga. Trova può richiedere diversi percorsi per cercare e troverà felicemente qualsiasi file anche nelle sottodirectory.

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(Il comando eseguito viene dato dopo il -execflag, che termina con il ;. {}Viene sostituito dal nome del file corrente.)


3

aggiungi questa riga all'inizio del tuo script

shopt -s nullglob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.