Capitolo 3. File e file system
3.3. Manipolare i file
3.3.3. Trovare i file
3.3.3.1. Utilizzo delle caratteristiche della shell
Abbiamo già visto nell'esempio dello spostamento dei file come la shell può gestire più file alla
volta. In quell'esempio la shell rileva automaticamente ciò che l'utente vuol dire in base alle
richieste contenute tra le parentesi quadre “[“ e “]”. La shell può sostituire serie di numeri e di
lettere maiuscole o minuscole indifferentemente. Essa sostituisce pure quanti caratteri volete con un
asterisco ed un solo carattere con un punto di domanda.
Tutti i tipi di sostituzioni possono essere usati contemporaneamente: la shell è molto logica in ciò.
La shell Bash, per esempio, non ha problemi con espressioni come ls dirname/*/*/*[2-3].
In altre shell, l'asterisco è comunemente usato per ridurre gli sforzi di battitura: una persona
potrebbe scrivere cd dir* al posto di cd directory. In Bash, comunque, ciò non è necessario
poiché la shell GNU ha una funzione chiamata completamento dei nomi dei file: significa che voi
potete battere i primi caratteri di un comando (ovunque) o di un file (nella directory corrente) e, se
non c'è possibilità di confusione, la shell indovinerà cosa cosa intendete dire. Per esempio, in una
directory contenente molti file, potete controllare se c'è qualche file che inizia con la lettera A
battendo soltanto ls A e premendo il tasto Tab per due volte, piuttosto che premere Invio. Se esiste
un solo file che inizia per “A”, questo verrà mostrato come argomento di ls (o qualsiasi altro
comando di shell) immediatamente.
3.3.3.2. which
Un modo piuttosto semplice per trovare i file è ricorrere al comando which, che, per l'appunto,
ricerca i file richiesti nelle directory elencate nel percorso di ricerca dell'utente. Naturalmente, dal
momento che il percorso di ricerca contiene solo percorsi a directory con programmi eseguibili,
which non funziona con i file normali. Il comando which è utile quando appaiono messaggi tipo
“Command not found”. Nell'esempio qui sotto, l'utente tina non può usare il programma acroread,
mentre il suo collega non incontra alcun problema sullo stesso sistema. Il problema è simile a
quello del PATH (o PERCORSO) della parte precedente: il collega di Tina le dice che lui può
vedere il programma richiesto in /opt/acroread/bin, ma questa directory non si trova nel
percorso di Tina:
tina:~> which acroread
/usr/bin/which: no acroread in (/bin:/usr/bin:/usr/bin/X11)
Il problema può essere risolto scrivendo il percorso completo del comando da avviare o
riesportando il contenuto della variabile PATH:
tina:~> export PATH=$PATH:/opt/acroread/bin
tina:~> echo $PATH
/usr:/usr/bin:/usr/bin/X11:/opt/acroread/bin
Con which si può anche controllare se un comando è un alias di un altro:
gerrit:~> which -a ls ls is aliased to 'ls -F --color=auto' ls is /bin/lsSe ciò non dovesse funzionare, utilizzate il comando alias:
tille@www:~/mail$ alias ls alias ls='ls --color'3.3.3.3. find e locate
Questi sono i veri strumenti utilizzati per trovare altri percorsi oltre a quelli elencati nel percorso di
ricerca [search path]. Lo strumento find, noto sin da UNIX, è molto potente, cosa che può
determinare una certa difficoltà di sintassi. Tale comando non solo vi consente di ricercare nomi di
file, ma accetta pure le dimensioni dei file, la data dell'ultima modifica e altre proprietà dei file
quali criteri di ricerca. L'uso più comune è la ricerca dei nomi dei file:
Ciò può essere così interpretato: “Cerca tutti i file e le sottodirectory contenute in un dato percorso
e stampa i nomi dei file contenenti la stringa di ricerca nel loro nome (non nel loro contenuto)”.
Altra applicazione di find si ha per ricercare file di una certa misura, come nell'esempio seguente,
dove l'utente peter vuole trovare tutti i file della corrente directory o di una delle sue sottodirectory,
che sono più grandi di 5 MB:
peter:~> find . -size +5000k psychotic_chaos.mp3
Se scavate nelle pagine man, vedrete che find può compiere operazioni sui file trovati. Un semplice
esempio è la rimozione dei file. E' meglio prima provare senza l'opzione -exec che siano stati
selezionati i file giusti e poi ridare il comando per cancellarli. Sotto, cerchiamo file che finiscono
per .tmp:
peter:~> find . -name “*.tmp” -exec rm {} \;
peter:~>
Ottimizzate!
Tale comando richiamerà rm tante volte quante sarà rintracciato un file corrispondente
ai criteri di ricerca. Nel peggior caso potrebbe essere migliaia o milioni di volte. E'
abbastanza un bel carico sul vostro sistema.
Un modo di procedere più realistico sarebbe quello di usare una pipe (|) e lo strumento
xargs con rm per argomento. In questa maniera il comando rm è chiamato solo
quando la linea di comando è piena, al posto di ogni file. Guardate il Capitolo 5 per
maggiori informazioni sull'uso della redirezione dell'I/O per facilitare i compiti di ogni
giorno.
Successivamente (nel 1999 secondo le pagine man, dopo 20 anni da find) è stato sviluppato locate.
Questo programma è più facile da usare, ma più limitato rispetto a find, dal momento che il suo
output si basa su un database indicizzato dei file che viene aggiornato solo una volta al giorno.
D'altra parte una ricerca nel database locate richiede minori risorse rispetto a find e quindi mostra i
risultati quasi istantaneamente.
Molte distribuzioni Linux oggi usano slocate, un locate migliorato dal punto di vista della
sicurezza, la versione moderna di locate che impedisce agli utenti di ottenere informazioni in uscita
che essi non hanno il diritto di leggere. I file nella directory personale di root sono un esempio:
questi non sono normalmente accessibili al pubblico. Un utente che desideri rintracciare qualcuno
che conosca la C shell può dare il comando locate .cshrc per vedere tutti gli utenti che hanno un
file personalizzato di configurazione della C shell. Supponendo che gli utenti root e jenny stiano
facendo girare una C shell, solo il file /home/jenny/.cshrc verrà mostrato e non quello nella
home directory di root. In molti sistemi locate è un collegamento simbolico al programma slocate:
billy:~> ls -l /usr/bin/locate
L'utente tina avrebbe potuto usare locate per trovare l'applicazione desiderata:
tina:~> locate acroread
/usr/share/icons/hicolor/16x16/apps/acroread.png /usr/share/icons/hicolor/32x32/apps/acroread.png /usr/share/icons/locolor/16x16/apps/acroread.png /usr/share/icons/locolor/32x32/apps/acroread.png /usr/local/bin/acroread /usr/local/Acrobat4/Reader/intellinux/bin/acroread /usr/local/Acrobat4/bin/acroread
Le directory che non contengono il nome bin non possono contenere il programma (esse non
contengono file eseguibili). Restano tre possibilità. Il file in /usr/local/bin è il solo che tina
avrebbe ricercato: è un collegamento allo script di shell che avvia l'attuale programma:
tina:~> file /usr/local/bin/acroread
/usr/local/bin/acroread: symbolic link to ../Acrobat4/bin/acroread
tina:~> file /usr/local/Acrobat4/bin/acroread
/usr/local/Acrobat4/bin/acroread: Bourne shell script text executable
tina:~> file /usr/local/Acrobat4/Reader/intellinux/bin/acroread /usr/local/Acrobat4/Reader/intellinux/bin/acroread: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses
shared libs), not stripped
Per mantenere il percorso più breve possibile, in modo tale che il sistema non debba cercare troppo
a lungo ogni volta che un utente vuole eseguire un programma, aggiungeremo /usr/local/bin
al percorso e non le altre directory, contenti solamente i file binari di uno specifico programma,
mentre /usr/local/bin contiene altri utili programmi.
Di nuovo: una descrizione delle funzionalità complete di find e di locate possono essere trovate
nelle pagine Info.
3.3.3.4. Il comando grep
3.3.3.4.1. Filtraggio delle linee in generale
Un semplice ma potente programma, grep, viene utilizzato per filtrare le linee in ingresso e
restituire certi modelli in uscita. Esistono letteralmente migliaia di applicazioni per il programma
grep. Nell'esempio seguente, jerry usa grep per vedere come ha utilizzato find:
jerry:~> grep -a find .bash_history find . -name userinfo
man find
find ../ -name common.cfg
Ricerca nella history
Pure utile in questi casi è la funzione di ricerca di bash, che si attiva premendo insieme
Ctrl+R, come nell'esempio dove vogliamo controllare nuovamente che cosa abbiamo
fatto con l'ultimo find:
thomas ~> ^R
Battete la vostra stringa di ricerca al prompt di ricerca. Più caratteri batterete e più
ridurrete i risultati della ricerca. Questa legge la cronologia (history) del comando della
sessione di shell (che viene scritta in .bash_history della vostra directory
personale quando voi chiudete quella sessione). Viene mostrata la più recente
apparizione della vostra stringa di ricerca. Se volete vedere i comandi precedenti che
contengono la medesima stringa, battete di nuovo Ctrl+R (v. pagine Info su Bash per
saperne di più).
Tutti gli Unix con un minimo di decenza hanno un dizionario in linea: così pure Linux. Il dizionario
è un elenco delle parole note in un file chiamato words, posizionato in /usr/share/dict. Per
controllare rapidamente la scrittura corretta di una parola, non serve un'applicazione grafica:
william:~> grep pinguin /us/share/dict/words
william:~> grep penguin /us/share/dict/words penguin
penguins
Dizionario contro elenco di parole
Alcune distribuzioni offrono il comando dict che mette a disposizione maggiori
funzionalità rispetto alla semplice ricerca di parole di un elenco.
Chi è il proprietario della home directory dopo la mia? Hey, c'è il suo numero telefonico!
lisa:~> grep gdbruyne /etc/passwd
gdbruyne:x:981:981:Guy Debruyne, tel 203234:/gdbruyne:/bin/bash
E, di nuovo, qual è l'indirizzo email di Arno?
serge:~/mail> grep -i arno *
sent-mail: To: <[email protected]>
sent-mail: On Mon, 24 Dec 2001, Arno [email protected] wrote: