5.9 Ricerca di file o nel contenuto di file
Spesso capita di non sapere se esiste un file all’interno di un filesystem o di non ricordare dove
è stato creato. Per ricercare un file all’interno del filesystem può essere utilizzato il comando
find (man page find(1)).
____________________________________________________________________
Comando: find
Path: /usr/bin/find
SINTASSI
$ find [path ...] [expression]
DESCRIZIONE
-
path indica il percorso della directory sulla quale effettuare la ricerca;
-
expression è un’espressione che indica il tipo di ricerca da effettuare. Essa può
essere composta da opzioni, test ed azioni separati da operatori (se non
indicato è assunta un’intersezione logica). Le possibili opzioni sono le
seguenti
- -daystart
indica di considerare la data/ora dall’inizio del giorno piuttosto che
dalle 24 ore precedenti;
-
-depth indica di visitare il contenuto delle eventuali sottodirectory prima di
visitare il contenuto della directory corrente;
- -follow
indica di seguire i symbolic link (implica -noleaf);
-
-help | --help
visualizza un aiuto sommario di find;
- -maxdepth n
indica di scendere al massimo di n livelli di sottodirectory rispetto a
quella indicata da path;
- -mindepth n
indica di considerare soltanto il contenuto delle sottodirectory almeno
i livello n rispetto a quella indicata da path;
-
-mount indica di non scendere in directory che sono mount-point di altri
filesystem;
- -noleaf
indica di non ottimizzare la visita dell’albero delle directory
assumendo che esse contengano effettivamente 2 sottodirectory in
meno rispetto al numero di hard link (questa opzione è necessaria per
i filesystem che non seguono gli standard Unix come i CD-ROM od
i filesystem MS-DOS o AFS - nei filesystem Unix una directory ha
almeno 2 hard link: quello relativo al proprio nome e quello relativo
a ‘.’; eventualmente ha gli hard link relativi ai file che essa contiene
e quello relativo alla directory padre ‘..’);
-
--version
visualizza la versione di find;
-
-xdev indica di non scendere nelle sottodirectory che sono mount-point di
altri filesystem;
I possibili test sono i seguenti
-
-amin n
indica i file il cui ultimo accesso è avvenuto n minuti prima;
-
-anewer filename
indica i file il cui ultimo accesso è più recente rispetto all’ultima
modifica del file filename;
-
-atime n
indica i file il cui ultimo accesso è avvenuto n × 24 ore prima;
-
-cmin n
indica i file il cui stato è variato n minuti prima;
-
-cnewer filename
indica i file il cui ultimo cambiamento di stato è più recente rispetto
all’ultima modifica del file filename;
-
-ctime n
indica i file il cui ultimo cambiamento di stato è avvenuto n × 24 ore
prima;
-
-empty indica i file vuoti (regular file o directory);
-
-false sempre falso;
-
-fstype type
indica i file he risiedono sul filesystem del tipo specificato da type
(v. -printf con la direttiva %F per vedere i tipi dei filesystem);
-
-gid n
indica i file il cui GID è n;
-
-group gname
indica i file il cui groupname è gname (può essere specificato anche
il GID);
-
-ilname pattern
come -lname ma il confronto è case insensitive;
-
-iname pattern
come -name ma il confronto è case insensitive;
-
-inum n
indica i file che si riferiscono all’inode n;
-
-ipath pattern
come -path ma il confronto è case insensitive;
-
-iregex pattern
come -regex ma il confronto è case insensitive;
-
-links pattern
indica i file che hanno n link;
-
-lname pattern
indica i file che sono symbolic link ed il cui contenuto contiene pattern;
-
-mmin n
indica i file il cui contenuto è stato modificato n minuti prima;
-
-mtime n
indica i file il cui contenuto è stato modificato n × 24 ore prima;
-
-name pattern
indica i file il cui nome (senza il relativo path) contiene pattern;
-
-newer filename
indica i file il cui contenuto è stato modificato più recentemente
rispetto al file filename;
-
-nouser
indica i file il cui UID non corrisponde a nessun utente;
-
-nogroup
indica i file il cui GID non corrisponde a nessun gruppo;
-
-path pattern
indica i file il cui path contiene pattern;
-
-perm mode
indica i file i cui permessi corrispondono esattamente a quelli indicati
da mode (come valore ottale o simbolico);
-
-perm -mode
indica i file i cui permessi (per i quali i bit sono a 1) corrispondono
tutti a quelli impostati da mode (come valore ottale o simbolico);
-
-perm +mode
indica i file i cui permessi (per i quali i bit sono a 1) corrispondono,
almeno uno, a quelli impostati da mode (come valore ottale o
simbolico);
-
-regex pattern
indica i file il cui nome verifica l’espressione regolare indicata da
pattern (viene fatto un confronto sull’intero path, non una ricerca al
suo interno);
-
-size n
indica i file che occupano n blocchi sul filesystem. Il valore numerico n
può essere seguito da una lettera che indica la dimensione dei blocchi
(v. tab. 5.13);
| Tabella 5.13: | Possibili suffissi per l’opzione -size di find. |
|
-
-true sempre vero;
-
-type file_type
indica i file del tipo specificato da file_type (v. tab. 5.14);
| Tabella 5.14: | Possibili tipi di file specificabili con l’opzione
-type di find. |
|
-
-uid n
indica i file il cui UID è n;
-
-used n
indica i file il cui ultimo accesso è avvenuto n giorni dopo l’ultima
variazione del loro stato;
-
-user uname
indica i file il cui username è uname (può essere specificato anche
l’UID);
-
-xtype file_type
come -type. Per i symbolic link viene controllato anche il tipo del file a cui
sis riferiscono;
Nei test, i valori numerici possono essere specificati come
-
+n indica un valore maggiore di n;
-
-n indica un valore minore di n;
-
n indica esattamente il valore n;
Le possibili azioni sono le seguenti
-
-exec command
indica di eseguire il comando command e viene interpretato
come vero se il comando ritorna un exit status uguale a 0. Gli
eventuali argomenti che seguono command vengono considerati come
parametri di command, fino ad un eventuale argomento ‘;’. La stringa
‘{}’ è sostituita dal nome del file corrente. Il comando viene eseguito
dalla working directory;
-
-fls file_name
come -ls ma scrive su file come -fprint. Viene sempre valutato
come vero;
-
-fprint file_name
scrive il nome del file nel file file_name (se file_name non esiste, viene
creato; se esiste viene troncato). Viene sempre valutato come vero;
-
-fprint0 file_name
come -print0 ma scrive l’output nel file file_name come -fprint.
Viene sempre valutato come vero;
-
-fprintf file_name format
come -printf ma scrive l’output nel file file_name come -fprint.
Viene sempre valutato come vero;
-
-ok command
come -exec ma chiede sempre conferma all’utente. se la risposta,
tramite lo standard input, non inizia per ‘y’ o per ‘Y’, non viene
eseguito command e viene considerato falso;
-
-print scrive il nome del file sullo standard output seguito da un carattere
LF (azione di default). Viene sempre valutato come vero;
-
-print0
scrive il nome del file sullo standard output seguito da un carattere
NUL. Viene sempre valutato come vero;
-
-printf format
scrive quanto indicato da format (v. tab. 5.15) sullo standard
output. Viene sempre valutato come vero;
| Tabella 5.15: | Possibili valori di format per l’opzione -printf di
find. |
|
I possibili operatori sono i seguenti
-
(expr) forza la precedenza al calcolo dell’espressione expr;
-
!expr negazione logica dell’espressione expr;
-
-not expr
come !expr;
-
expr1 expr2
intersezione logica implicita: expr2 viene valutata soltanto se expr1
risulta vera;
-
expr1 -a expr2
come expr1 expr2;
-
expr1 -and expr2
come expr1 expr2;
-
expr1 -o expr2
unione logica: expr2 non viene valutata se expr1 risulta vera;
-
expr1 -or expr2
come expr1 -o expr2;
-
expr1 , expr2
expr1 e expr2 vengono sempre valutate. Il risultato è determinato
soltanto da expr2;
____________________________________________________________________
find visita tutto l’albero del filesystem la cui radice è indicata da path, valutando, per ogni
file (o directory), l’espressione expression. Il primo parametro che inizia per -, (, ), , o ! è
considerato l’inizio di expression.
L’exit status di find è 0 se tutto ok, e maggiore di 0 se si verificano dei problemi.
[da completare ...]
Il comando which (man page which(1)) invece permette di ricercare un file nelle varie
directory elencate nella variabile di ambiente PATH.
__________________________________________________________________________________________________________
Comando: which
Path: /usr/bin/which
SINTASSI
$ which [option] [--] command [...]
DESCRIZIONE
-
option è l’insieme delle opzioni che modificano il comportamento di which. Può assumere
i seguenti valori:
-
-a | --all
indica di visualizzare tutti i comandi trovati, non soltanto il primo;
-
-i | --read-alias
indica di leggere gli alias dallo standard input;
-
--skip-alias
indica di ignorare l’eventuale opzione -i o --read-alias;
-
--read-functions
indica di leggere le funzioni dallo standard input;
-
--skip-functions
indica di ignorare l’eventuale opzione --read-functions;
-
--skip-dot
indica di ignorare le eventuali directory specificate in PATH che
iniziano con il carattere ‘.’;
-
--skip-tilde
indica di ignorare le eventuali directory specificate in PATH che
iniziano con il carattere ‘~’ e gli eventuali eseguibili presenti nella
home directory;
-
--show-dot
indica di visualizzare i path relativi dei comandi trovati.;
-
--show-tilde
indica di visualizzare il simbolo ~ per la parte di path che coincide
con la home directory;
-
--tty-only
indica di considerare soltanto le richieste che arrivano dalla TTY;
-
-v | -V | --version
visualizza la versione di which;
-
--help visualizza un aiuto sommario di which;
-
command è il comando di cui si desidera scovare il path;
_____________________________
L’exit status di which è un valore che indica il numero di opzioni non consentite o -1 se
non viene specificato nessun comando.
Ad esempio, il comando
$ which ls
visualizzerà il path del comando ls (il primo trovato nelle directory elencate da PATH), cioè
/bin/ls.
Poiché il percorso di ricerca di which è lo stesso di quello utilizzato dalla shell
nell’interpretazione dei comandi (v. cap. 3), which è un comando che può essere utile
quando, in corrispondenza del lancio di un comando, si ha come risposta un messaggio del
tipo
bash: cmd: command not found
dove cmd è il comando impartito.
Un altro comando utile di GNU/Linux è grep (man page grep(1)). Si tratta di un
comando molto complesso che permette di effettuare ricerche di sequenze di byte all’interno di
un file.
_______________________________________________________________
Comando: grep
Path: /bin/grep
SINTASSI
$ grep [option] pattern [file]
DESCRIZIONE
-
option è l’insieme delle opzioni che modificano il comportamento di grep. Può assumere i
seguenti valori:
-
-A num | --after-context=num
indica di visualizzare num righe di seguito a quella che contiene la
stringa ricercata;
-
-a | --text
indica di trattare i file binari come se fossero file di testo;
-
-B num | --before-context=num
indica di visualizzare num righe prima di quella che contiene la
stringa ricercata;
-
-C num | --context=num
indica di visualizzare num righe assieme a quella che contiene la
stringa ricercata;
-
-b | --byte-offset
indica di visualizzare il numero di byte dall’inizio del file prima della
riga contenente la stringa ricercata;
- --binary-files=type
indica di considerare i file binari come indicato da type:
without-match specifica di non considerare il contenuto dei file binari
(opzione -I), text specifica di considerare i file binari come se fossero
file di testo (opzione -a);
-
--colour[=when] | --color[=when]
indica di colorare la stringa trovata (con il colore specificato dalla
variabile di ambiente GREP_COLOR - default rosso) secondo quanto
indicato da when, che può assumere i valori never, always o auto (il
default è auto);
-
-c | --count
indica di visualizzare soltanto il numero di righe che contengono la
stringa ricercata;
-
-D action | --device=action
specifica il comportamento da tenere nel caso in cui file sia un
dispositivo, una FIFO o un socket, secondo quanto indicato da action:
read indica di considerare il file (default), mentre skip indica di non
considerarlo;
-
-d action | --directory=action
specifica il comportamento da tenere nel caso in cui file sia
una directory, secondo quanto indicato da action: read indica di
considerare la directory come se fosse un file (default), skip indica di
non considerarla, mentre recurse indica di considerare, in maniera
ricorsiva, tutti i file presenti nella directory (v. opzione -r);
-
-E | --extended-regexp
indica di considerare pattern un’espressione regolare
estesa;
-
-e pattern | --regexp=pattern
specifica la stringa da ricercare, considerando eventuali caratteri ‘-’
presenti all’inizio della stessa;
-
-F | --fixed-strings
indica di considerare pattern un elenco di stringhe separate da CR
o CR + LF, ognuna delle quali deve essere ricercata;
-
-P | --perl-regexp
indica di considerare pattern un’espressione regolare Perl;
-
-f pfile | --file=pfile
indica di considerare le righe del file pfile quali pattern da ricercare;
-
-G | --basic-regexp
indica di considerare pattern un’espressione regolare
(default);
-
-H | --with-filename
indica di visualizzare il nome del file per ogni riga trovata (default);
-
-h | --no-filename
indica di non visualizzare il nome del file per ogni riga trovata;
-
--help visualizza un aiuto sommario di grep;
-
-I indica di ignorare i file binari;
-
-i | --ignore-case
indica di non discriminare tra lettere maiuscole e minuscole;
-
-L | --files-without-match
indica di visualizzare soltanto i nomi dei file che non contengono la
stringa ricercata;
-
-l | --files-with-matches
indica di visualizzare soltanto i nomi dei file che contengono la stringa
ricercata;
-
-m num | --max-count=num
indica di considerare soltanto le eventuali prime num occorrenze
all’interno del file;
-
--mmap indica di utilizzare la system call mmap() invece di read() per leggere
i file (in certi casi si possono così ottenere prestazioni migliori);
-
-n | --line-number
indica di visualizzare anche il numero della riga che contiene la
stringa ricercata;
-
-o | --only-matching
indica di visualizzare soltanto la stringa trovata all’interno del file;
-
--label=filename
indica di considerare l’input proventiente dallo standard input, come
se provenisse dal file filename;
-
--line-buffered
indica di utilizzare ili line buffering (si degradano le prestazioni);
-
-q | --quiet | --silent
indica di non visualizzare niente e di restituire un extit status nullo
se almeno un’occorrenza è stata trovata;
-
-R | -r | --recursive
indica di considerare tutti i file all’interno di eventuali directory;
-
--include=ptn
indica di ricercare all’interno delle directory soltanto la stringa
specificata da ptn;
-
--exclude=ptn
indica di scartare all’interno delle directory i file contenenti la stringa
specificata da ptn;
-
-s | --no-messages
indica di non visualizzare i messaggi di errore relativi a file non
esistenti o illeggibili;
-
-U | --binary
indica di considerare i file come binari: il carattere CR presente
alla fine di ogni riga di un file di testo per piattaforme DOS o
Windows viene considerato come tale e quindi alcune espressioni
regolari potrebbero non funzionare correttamente (per default grep,
nel caso di file per piattaforma DOS o Windows, tenta di capire il
tipo del file dai suoi primi 32 KB e nel caso sia un file di testo, il
carattere CR viene scartato);
-
-u | --unix-byte-offsets
se utilizzato con l’opzione -b indica di visualizzare il numero di byte
dall’inizio del file a cui è stata trovata la stringa da ricercare, senza
considerare i caratteri CR sui fine riga (file di testo per DOS o
Windows);
-
-V | --version
visualizza la versione di grep;
-
-v | --invert-match
indica di invertire il risultato della ricerca: vengono visualizzate le
righe dei file che non contengono la stringa ricercata;
-
-w | --word-regexp
indica di visualizzare soltanto le righe dei file che contengono la
stringa ricercata come parola intera;
-
-x | --line-regexp
indica di visualizzare soltanto le righe dei file che contengono soltanto
la stringa ricercata;
-
-y (obsoleto) come -i;
-
-Z | --null
indica di non aggiungere nessun carattere dopo il nome del file nella
visualizzazione del risultato della ricerca;
-
pattern è la stringa da ricercare;
-
fileè il nome del file nel quale deve essere ricercata la stringa pattern (se omesso o
indicato con ‘-’ , viene considerato lo standard input);
È possibile utilizzare opzioni predefinite, assegnandole alla variabile di ambiente
GREP_OPTIONS.
____________________________________________________
Ad esempio, il comando
$ grep -n --color pippo *
visualizza le righe di tutti i file (*) presenti nella working directory, contenenti la stringa
‘pippo’, con il riferimento al numero della riga ed al nome del file, ed evidenziando la stringa
ricercata. Invece il comando
$ grep -Lr pippo *
visualizza i nomi di tutti i file (*) presenti nella working directory e nelle eventuali
sottodirectory, che non contengono la stringa ‘pippo’.