• Non ci sono risultati.

Trovare i file

Nel documento Introduzione a Linux (pagine 71-76)

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/ls

Se 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 e­mail di Arno?

serge:~/mail> grep -i arno *

sent-mail: To: <[email protected]>

sent-mail: On Mon, 24 Dec 2001, Arno [email protected] wrote:

find e locate vengono spesso usati in combinazione con grep per realizzare delle ricerche serie. Per 

maggiori informazioni, v. Capitolo 5 sulla redirezione dell'I/O.

3.3.3.4.2. Caratteri speciali

I caratteri che hanno uno speciale significato per la shell devono essere segnalati con il carattere di 

escape: nella Bash è la sbarra inversa, come in molte shell, e determina lo speciale significato del 

carattere successivo. La shell conosce svariati caratteri speciali tra cui, i più comuni, “/”,”.”,”?” e 

“*”. Un elenco completo si può trovare nelle pagine Info e nella documentazione della vostra shell.

Per esempio, dire che volete vedere il file “*” al posto  di tutti i file di una directory, dovete usare 

less\*

Lo stesso vale per i nomi di file contenenti uno spazio:

cat This\ File

3.3.4. Più modi di vedere il contenuto dei file

Nel documento Introduzione a Linux (pagine 71-76)