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:
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?
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è:
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:
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:
oppure
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.