Wildcard e globbing in Linux: guida pratica e completa

Introduzione ai caratteri jolly
Un carattere jolly (wildcard), detto anche metacarattere, è un simbolo che rappresenta uno o più caratteri reali quando la shell espande un pattern. La shell, non i programmi, espande questi pattern prima di invocare il comando: scrivi un pattern, la shell lo sostituisce con i nomi di file corrispondenti e poi lancia il programma con i nomi già risolti.
Definizione rapida: globbing è il processo con cui la shell trasforma un pattern in una lista di nomi di file.
Perché è utile: risparmio di tempo, scripting più pulito, possibilità di operare su insiemi di file senza costruire loop complessi.
Nota: non confondere globbing con le espressioni regolari (regex). Sono concetti diversi: le regex le interpreta il programma (ad es. grep), i glob li interpreta la shell.
Panorama delle funzionalità più comuni
- ? — corrisponde a un singolo carattere.
- — corrisponde a zero o più caratteri.
- [abc] — corrisponde a uno qualsiasi dei caratteri elencati.
- [a-z] — corrisponde a un intervallo di caratteri.
- {a,b} — espansione di elenchi (brace expansion), non esattamente globbing, ma spesso usata insieme.
- (pl|py) e altri costrutti con
|
— richiedono l’estensione avanzata (extglob o sintassi di alcune shell). - ** — in alcune shell e con opzioni attivate corrisponde ricorsivamente a directory e sottodirectory.
Questi strumenti si combinano per costruire pattern flessibili.
Come la shell espande i pattern
Passaggi semplificati:
- La shell analizza la riga di comando e identifica i pattern.
- Per ogni token che contiene metacaratteri, la shell cerca i nomi di file corrispondenti.
- Sostituisce il token con la lista di file trovati, ordinata secondo le regole della shell e della locale.
- Il comando viene eseguito con gli argomenti espansi.
Se non ci sono corrispondenze, il comportamento dipende dalle opzioni della shell: può lasciare il pattern tale e quale, restituire un errore o espandere in vuoto.
Specificare un carattere: “?”
Il punto interrogativo ?
corrisponde a esattamente un carattere. Esempio pratico: immagini di nome photo_01.jpg, photo_02.jpg ecc.
ls photo_0?.jpg
Questo elencherà photo_01.jpg
, photo_02.jpg
, ma non photo_100.jpg
(troppi caratteri) né photo_.jpg
(troppo pochi).
Esempi aggiuntivi:
ls *.p?
corrisponde a file come script.pl
e script.py
(se i nomi terminano con .pl
o .py
), poiché ?
prende il singolo carattere finale.
Casi d’uso: selezione di file con suffissi numerati o quando sai esattamente la lunghezza di una porzione del nome.
Corrispondere più caratteri con “*”
L’asterisco *
corrisponde a zero o più caratteri. È il carattere jolly più usato (workhorse).
Esempi:
ls *.jpg
ls photos/*.jpg
ls *d*
Questi mostrano tutte le JPEG nella directory corrente, tutte le JPEG nella sottodirectory photos e tutti i file che contengono una d
da qualche parte nel nome.
In zsh e in Bash (con opzione abilitata) è disponibile il glob ricorsivo :
ls ~/
ls /usr//bin
- In Bash abilitare con:
shopt -s globstar
- In zsh è spesso abilitato di default;
scende nelle sottodirectory.
Attenzione: l’uso di ***
(tre asterischi) non è standard e il comportamento può variare: alcune configurazioni lo usano per seguire anche i link simbolici.
Non confondere *
con *.*
di MS-DOS: in Linux *
già corrisponde a tutto.
Esempio di copia e cautela:
cp * /altro/directory
Non usare jolly alla cieca con comandi distruttivi (ad es. rm
). Verifica prima con ls
o echo
.
Intervalli e insiemi con parentesi quadre
Le parentesi quadre [ ]
permettono di specificare un insieme o un intervallo di caratteri.
Esempi:
[a-z]
[A-Z]
[0-9]
[a-zA-Z0-9]
[p[ly]]
Un uso pratico:
ls *.p[ly]
Questo corrisponde a file che terminano con .pl
o .py
.
Nota tecnica: l’interpretazione degli intervalli rispetta la locale di sistema (ad es. ordini alfabetici specifici), quindi in alcune locali gli intervalli possono comportarsi in modo non intuitivo.
Espansione con parentesi graffe
La brace expansion {a,b}
non è propriamente globbing; è un’espansione della shell che genera parole multiple combinando sezioni.
Esempi:
echo {cat,dog}
echo {a..d}
echo {1..10}
Questi comandi stampano rispettivamente cat dog
, a b c d
e i numeri da 1 a 10. Le parentesi graffe sono utili per generare serie di nomi, provare comandi o creare directory in batch.
Usa le parentesi graffe per costruire insiemi prevedibili invece di affidarti a pattern vaghi.
Corrispondenze alternative con parentesi e pipe
Alcune shell supportano estensioni avanzate (extglob) che permettono costrutti come (pl|py)
:
ls *.(pl|py)
Questa sintassi richiede spesso di attivare l’opzione estesa in Bash:
shopt -s extglob
Oppure usare shell che la supportano nativamente (zsh). Altri operatori utili in extglob:
?(pattern)
— zero o una ripetizione*(pattern)
— zero o più ripetizioni+(pattern)
— una o più ripetizioni@(pattern|pattern2)
— una delle alternative!(pattern)
— tutto tranne le alternative
Questi estendono la potenza dei glob oltre *
e ?
.
Escludere corrispondenze con “!” e “^”
Dentro [ ]
puoi negare un insieme con !
o ^
come primo carattere:
ls [!a-z]
ls [^a-z]
Ciò mostrerà file i cui caratteri non rientrano nell’intervallo specificato.
Con extglob puoi escludere intere alternative:
!(a|b|c)
Questo corrisponde a tutto tranne a
, b
o c
.
Disattivare l’espansione con le virgolette
Se vuoi passare il pattern così com’è a un programma (ad es. grep che usa ^
per l’inizio della linea), devi quotare per impedire che la shell faccia il globbing.
- Single quotes (‘) disabilitano totalmente l’espansione e l’interpretazione delle variabili.
- Double quotes (“) disabilitano il globbing ma permettono l’espansione delle variabili.
Esempi:
grep '^foo' file.txt
pattern="$var"
grep "^$pattern" file.txt
Usa le virgolette quando l’input dell’utente o una variabile può contenere metacaratteri.
Opzioni della shell che influenzano il comportamento dei glob
Le shell moderne offrono molte opzioni che cambiano il comportamento del globbing. Ecco le più importanti con esempi pratici.
- nullglob (Bash/zsh equivalente): se attivo, un pattern senza corrispondenze si espande in una lista vuota invece che rimanere letterale.
- Bash:
shopt -s nullglob
- Bash:
- failglob (Bash): se attivo, un pattern senza corrispondenze genera un errore.
- Bash:
shopt -s failglob
- Bash:
- dotglob: permette a
*
di includere file che iniziano con.
(file nascosti).- Bash:
shopt -s dotglob
- Bash:
- globstar: abilita
**
in Bash per la ricerca ricorsiva.- Bash:
shopt -s globstar
- Bash:
- extglob: abilita le estensioni avanzate come
!(...)
.- Bash:
shopt -s extglob
- Bash:
Esempio pratico di impostazioni raccomandate per scripting robusto:
#!/bin/bash
shopt -s nullglob dotglob extglob
# ora i pattern sono più prevedibili nello script
Ma attenzione: queste opzioni cambiano il comportamento globale della shell; documentale nel tuo script e usa shopt -u
per disattivarle se necessario.
Differenze tra shell e compatibilità
Breve matrice di compatibilità:
- Bash: supporta
?
,*
,[ ]
, brace expansion. Supportacon
shopt -s globstar
. Supporta extglob conshopt -s extglob
. - Zsh: pattern molto avanzati,
ricorsivo nativo, estensioni di glob molto potenti e configurabili. Spesso preferita dagli utenti avanzati.
- ksh: simile a Bash per molti aspetti, alcune differenze nelle estensioni.
- fish: non usa la stessa sintassi di brace expansion come Bash e gestisce il globbing in modo diverso; gli script portati da Bash a fish richiedono attenzione.
Se scrivi script portabili, evita estensioni non POSIX o documentale l’uso di Bash (shebang #!/bin/bash
).
Quando il globbing fallisce: esempi e contromisure
- File nascosti non trovati:
ls *
non mostra.bashrc
. Soluzione: usals -d .* *
o abilitadotglob
se necessario. - Nessuna corrispondenza e pattern lasciato letterale: può creare errori. Soluzione:
shopt -s nullglob
o controlla concompgen -G "pattern"
in Bash. - Nomi con spazi o caratteri speciali: un’espansione può creare più argomenti se non quotata. Soluzione: sempre gestire i risultati con loop che preservano i nomi, usare
printf '%s\0'
e xargs -0.
Esempio sicuro per loop su file:
while IFS= read -r -d '' file; do
echo "Elaboro: $file"
done < <(printf '%s\0' *.jpg)
Oppure usare find
con -print0
e xargs -0
:
find . -name '*.jpg' -print0 | xargs -0 rm --
Globbing vs regex: quale usare e quando
- Usa globbing quando vuoi fare corrispondenze semplici di nomi di file (veloce, gestito dalla shell).
- Usa regex quando hai bisogno di pattern più potenti all’interno di strumenti che le supportano (grep, sed, awk, perl).
Esempio: trovare file che contengono cifre e trattini in mezzo al nome è comodo con regex in find:
find . -regextype posix-extended -regex './[a-z]+-[0-9]+'
Ma per la maggior parte delle operazioni sui nomi di file, i glob sono più semplici.
Best practice e flusso operativo sicuro
- Prova prima: usa
echo
ols
sul pattern prima di eseguire cose distruttive. - Usa
--
dopo comandi che interpretano argomenti come opzioni (es.rm -- *.txt
). - Se possibile, usa
rm -i
o sposta i file in una trash directory invece di cancellarli definitivamente. - Se lavori con input esterno (es. variabili utente), quotalo o valida prima.
- Documenta le opzioni della shell richieste dallo script: all’inizio dello script aggiungi i
shopt -s
necessari.
Mini-metodologia per un’operazione di massa sicura:
- Genera l’elenco con
ls
oprintf
. - Verifica visivamente o con uno script che verifica dimensioni/timestamps.
- Esegui una prova con
--dry-run
se il tool lo supporta o sposta in una cartella temporanea. - Esegui l’azione definitiva.
Esempi pratici estesi
Selezionare tutti i file JPEG nelle sottodirectory (Bash con globstar):
shopt -s globstar
ls **/*.jpg
Eliminare tutti i file tranne quelli con estensione .conf:
shopt -s extglob
rm -- !(*.conf)
Copiare solo file che iniziano con lettere e contengono un numero:
cp [A-Za-z]*[0-9]* /destinazione
Generare nomi sequenziali con parentesi graffe e crearli:
mkdir project-{alpha,beta,gamma}
Role-based checklist
Novizio:
- Verifica sempre con
ls
prima di cancellare. - Metti i nomi con spazi tra virgolette quando li usi in script.
- Evita extglob se non sai cosa fa.
Sviluppatore:
- Documenta le opzioni della shell richieste (shopt).
- Usa
nullglob
per evitare pattern non espansi. - Testa script con casi limite (file nascosti, nomi strani, caratteri unicode).
Amministratore di sistema:
- Usa
find
per operazioni su filesystem grandi e per criteri complessi. - Usa
-print0
exargs -0
per robustezza. - Configura alias sicuri per rm (ad es.
alias rm='rm -i'
) sui sistemi non automatizzati.
Sicurezza e hardening
- Mai fidarsi di input esterno per costruire pattern. Un pattern malformato può espandere in molti file o nessuno.
- Evita l’esecuzione di comandi costruiti concatenando stringhe non validate.
- Quando rimuovi file, usa
--
per separare le opzioni dagli argomenti:rm -- *.txt
. - In script che girano con privilegi elevati, disabilita globbing non necessario o valida strettamente i pattern.
Alternative al globbing per scenari complessi
- find: ricorsivo, filtri per tipo, permessi, tempo, regex.
- rsync: sincronizzazione selettiva con pattern e opzioni sicure.
- perl/python: per manipolazioni avanzate sui nomi quando la logica supera le capacità dei glob.
- grep con nullbyte quando processi output di
find -print0
.
Esempio: usare find per escludere directory e usare nomi con spazi:
find /data -type f -name '*.log' -not -path '*/archive/*' -print0 | xargs -0 gzip
Quando non usare i wildcard: controesempi
- Non usare
rm *
in/tmp
o in directory che possono contenere nomi inattesi. - Non basare sicurezza su pattern che escludono file nascosti:
.ssh
potrebbe essere escluso da*
ma presente. - Non usare estensioni non supportate su server con versioni vecchie di Bash.
Glossario in una riga
- Globbing: espansione dei pattern della shell in nomi di file.
- Wildcard: sinonimo di carattere jolly (es.
*
,?
). - extglob: estensioni avanzate del glob in Bash.
- globstar: opzione che abilita
**
per la ricerca ricorsiva.
Criteri di accettazione per uno script che usa wildcard
- Lo script documenta le opzioni shopt necessarie all’inizio.
- Ogni uso di pattern su input non attendibile è validato o quotato.
- Le operazioni distruttive richiedono un flag esplicito
--confirm
o una prova--dry-run
. - Lo script gestisce nomi con spazi/speciali usando nullbyte o quoting.
Checklist di test e casi di accettazione
- Test con file: “normali”, con spazi, con newline nel nome, file nascosti, nomi unicode.
- Test in shell con opzioni diverse: dotglob attivo/disattivo, nullglob attivo/disattivo.
- Test su sistemi con Bash vecchia per verificare la non disponibilità di globstar/extglob.
Riepilogo e raccomandazioni finali
I caratteri jolly sono strumenti potenti per lavorare rapidamente con file e directory nella shell. Impara i comandi base (*
, ?
, [ ]
, { }
) e prosegui con opzioni avanzate quando ne hai bisogno (extglob
, globstar
). Per operazioni rischiose controlla sempre il risultato del pattern prima di eseguire comandi distruttivi, usa strumenti come find
o rsync
quando ti serve maggiore controllo e presta attenzione ai file nascosti e ai nomi con caratteri speciali.
Punti chiave:
- Testa il pattern con
ls
oecho
prima di operare. - Gestisci nomi contenenti spazi con quoting o nullbyte.
- Documenta le opzioni di shell usate nei tuoi script.
Conoscere bene il globbing ti farà risparmiare tempo ed errori: parti dai fondamenti e aggiungi le estensioni solo quando serve.
Materiali simili

Monitorare e gestire Apache Tomcat

Disney Plus non funziona? Guida rapida di risoluzione

Pianificare script Python con Task Scheduler

Revoca app Google, Drive e dispositivi

Protezione dal riciclo dei numeri di telefono
