Probabilmente usate già i caratteri speciali (noti anche come meta-caratteri, o anche caratteri jolly) senza saperlo. Quando scrivete o cercate un file in Windows potete utilizzare il carattere * al posto di una sequenza di caratteri qualsiasi. Per esempio, scrivendo *.txt identificate tutti i file il cui nome finisce per .txt. Lo abbiamo anche utilizzato spesso nell'ultimo paragrafo. Ma * non è l'unico carattere speciale di cui potete servirvi.
Quando digitate un comando come ls *.txt e premete Invio, il compito di individuare i file che corrispondono all'espressione *.txt non viene svolto dal comando ls, ma dalla shell stessa. Vediamo più in dettaglio in che modo la shell interpreta una linea di comando quando questa viene digitata. Se scrivete:
$ ls *.txt readme.txt ricette.txt |
prima di tutto la linea di comando viene suddivisa in parole (ls e *.txt in questo esempio). Quando la shell trova un carattere * in una parola, interpreterà la parola intera come un modello di meta-espansione e la sostituirà con i nomi di tutti i file che corrispondono al modello. Pertanto la linea di comando che viene effettivamente eseguita sarà ls readme.txt recipe.txt, che darà i risultati che abbiamo mostrato. Ci sono altri caratteri che vengono interpretati in modo simile dalla shell:
? sostituisce un carattere qualsiasi, ma soltanto uno;
[...] stabilisce una corrispondenza con qualsiasi carattere si trovi fra le parentesi quadre; in questo caso è possibile definire un ambito di caratteri (ad es. 1-9) o dei valori discreti, o addirittura entrambi. Ad esempio: [a-zBE5-7] comprende tutti i caratteri da a a z, una B, una E, un 5, un 6 o un 7;
[!...] stabilisce una corrispondenza con qualsiasi carattere che non sia indicato tra le parentesi quadre. [!a-z], ad esempio, verrà sostituito da qualsiasi carattere che non sia una lettera minuscola;
{c1,c2} viene sostituito da c1 o c2, dove c1 e c2 sono a loro volta delle espressioni jolly.
Ecco alcuni esempi con il relativo significato:
/etc/*conf Tutti i file nella directory /etc il cui nome finisce con conf. Può rappresentare /etc/inetd.conf, ma vale anche per /etc/conf.linuxconf, come pure per /etc/conf se esiste un file con questo nome. Ricordate che * può rappresentare anche una stringa vuota.
image/cars,space[0-9]/*.jpg Tutti i file il cui nome termina con .jpg nelle directory image/cars, image/space0, ... , image/space9, se queste directory esistono.
/usr/doc/*/README Tutti i file di nome README in tutte le directory immediatamente sotto /usr/doc. Questa espressione vale per /usr/doc/mandrake/README, ad esempio, ma non per /usr/doc/myprog/doc/README.
*[!a-z] Tutti i file nella directory attuale il cui nome non termina con una lettera minuscola.