Metacaratteri
Nel capitolo precedente avete imparato alcuni comandi di manutenzione dei file: cp , mv e rm .
Può capitare che vogliate interagire con più di un file alla volta. Per esempio, potreste voler copiare tutti i file che
cominciano con data nella directory ~/backup : si può fare sia dando più comandi cp , sia
elencando tutti i file in un'unica linea di comando; entrambi questi metodi, comunque, portano via molto tempo e avete molte possibilità
di compiere errori. Una via migliore per farlo è scrivere:
/home/larry/report$ ls -F
1993-1 1994-1 data1 data5
1993-2 data-new data2
/home/larry/report$ mkdir ~/backup
/home/larry/report$ cp data* ~/backup
/home/larry/report$ ls -F ~/backup
data-new data1 data2 data5
/home/larry/report$
Come potete vedere, l'asterisco dice a cp di prendere tutti i file che iniziano con data e copiarli in ~/backup .
Riuscite ad indovinare cosa farebbe cp d*w ~/backup ? Ma cosa succede realmente ? Buona domanda. In realtà ci sono
due caratteri speciali che vengono intercettati dalla shell bash . Il carattere "*", un asterisco, dice "sostituisci
questa parola con tutti i file che verificano questa specifica". In questo modo, il comando cp data* ~/backup , come
nell'esempio precedente, viene cambiato in cp data-new data1 data2 data5 ~/backup prima di venire eseguito.
Per vedere come funziona introduciamo un nuovo comando, echo . echo è un comando estremamente semplice;
rimanda sullo schermo o stampa ogni parametro. Cioè:
/home/larry$ echo Ciao!
Ciao!
/home/larry$ echo Come va?
Come va?
/home/larry$ cd report
/home/larry/report$ ls -F
1993-1 1994-1 data1 data5
1993-2 data-new data2
/home/larry/report$ echo 199*
1993-1 1993-2 1994-1
/home/larry/report$ echo *4*
1994-1
/home/larry/report$ echo *2*
1993-2 data2
/home/larry/report$
Come potete vedere, la shell espande il metacarattere e passa tutti i file al programma che volete sia eseguito. Questo solleva una
domanda interessante: cosa succede se non ci sono file che incontrano le specifiche del metacarattere? Provate echo /rc/fr*og
e guardate cosa succede... bash passa testualmente la stringa con il metacarattere al programma. Bisogna dire anche che altre shell,
come tcsh , invece di passare testualmente il metacarattere, rispondono No match . Ecco lo stesso comando sotto tcsh:
mousehouse>echo /rc/fr*og
echo: No match.
mousehouse>
L'ultima cosa che chiederete è come fare se volete che sullo schermo compaia data* , al posto della lista dei nomi
dei file? Beh, sia sotto bash che tcsh, basta racchiudere la stringa tra virgolette:
/home/larry/report$ echo "data*"
data*
/home/larry/report$
oppure
mousehouse>echo "data*"
data*
mousehouse>
Oltre all'asterisco, anche il punto interrogativo viene interpretato dalla shell come carattere speciale. Un punto interrogativo corrisponde
ad uno ed un solo carattere. Per esempio, ls /etc/?? mostra tutti i nomi di file di due lettere nella directory
/etc .
|