Cercare qualcosa all’interno dei sistemi Linux è abbastanza semplice, e ci sono varie alternative a seconda delle situazioni.
Cercare qualcosa all’interno di un file.
Il più noto è sicuramente l’istruzione grep che solitamente viene utilizzata per cercare qualcosa all’interno di un file. Può essere utilizzato direttamente o “appeso” come istruzione secondaria. Vediamo due esempi che portano al medesimo risultato:
cat nomefile.txt | grep -i expire
grep -i expire nomefile.txt
Nel primo caso abbiamo effettuato un cat di un file, a cui abbiamo concatenato il comando grep. L’istruzione -i significa che la ricerca debba ignorare maiuscole e minuscole. Nel secondo caso abbiamo fatto la stessa cosa solo che abbiamo direttamente utilizzato grep.
Possiamo anche effettuare una ricerca avvalendoci delle istruzioni regolari, e quindi cercare una parola o parte di essa all’interno di più file. Ad esempio vogliamo cercare parzialmente la parola exclude su tutti i file di testo della directory corrente:
grep -i exclu* *.txt
In questo caso cerchiamo tutte le parole che iniziano per “exclu” in tutti i file con estensione txt.
Se vogliamo invece effettuare una ricerca su directory e sotto directories dobbiamo apporre l’opzione -R
grep -i exclu* -R cartella/*.txt
Se togliamo l’estensione di fatto stiamo cercando una parola su file che non conosciamo a priori. Se poi invece della cartella mettiamo solo la “/” andiamo ed effettuare la ricerca all’interno di tutto il sistema operativo. Come possiamo vedere la duttilità di ricerca di questo comando è davvero ottima.
Altre istruzioni di Grep sono:
Uso: grep [OPZIONE]... MODELLO [FILE]...
Cerca il MODELLO in ogni FILE o nello standard input.
MODELLO è, in modo predefinito, un'espressione regolare di base (BRE).
Esempio: grep -i "ciao mondo" menu.h main.c
Selezione e interpretazione delle regexp:
-E, --extended-regexp MODELLO è un'espressione regolare estesa (ERE)
-F, --fixed-strings MODELLO è un insieme di stringhe letterali separate
da newline
-G, --basic-regexp MODELLO è un'espressione regolare semplice (BRE)
-P, --perl-regexp MODELLO è un'espressione regolare Perl
-e, --regexp=MODELLO Usa MODELLO per la corrispondenza
-f, --file=FILE Ottiene il MODELLO dal FILE
-i, --ignore-case Ignora la distinzione tra maiuscole e minuscole
-w, --word-regexp Forza MODELLO a corrispondere solo a parole intere
-x, --line-regexp Forza MODELLO a corrispondere solo a righe intere
-z, --null-data Una riga di dati termina con il byte 0 invece che
newline
Varie:
-s, --no-messages Elimina i messaggi di errore
-v, --invert-match Seleziona le righe che non corrispondono
-V, --version Stampa la versione ed esce
--help Visualizza questo aiuto ed esce
Controllo dell'output:
-m, --max-count=NUM Si ferma dopo NUM corrispondenze
-b, --byte-offset Stampa l'offset del byte con le righe di output
-n, --line-number Stampa il numero della riga con le righe di output
--line-buffered Fa il flush dell'output con ogni riga
-H, --with-filename Stampa il nome del file per ogni corrispondenza
-h, --no-filename Elimina il nome del file dall'output
--label=ETICH Usa ETICH come nome del file per lo standard input
-o, --only-matching Mostra solo la parte della riga corrispondente al
MODELLO
-q, --quiet, --silent Elimina tutto l'output normale
--binary-files=TIPO Suppone che i file binari siano del TIPO \"binary\",
\"text\" oppure \"without-match\"
-a, --text Equivale a --binary-files=text
-I Equivale a --binary-files=without-match
-d, --directories=AZIONE Come gestire le directory: AZIONE è "read",
"recurse" o "skip"
-D, --devices=AZIONE Come gestire device, FIFO e socket: AZIONE è
"read" o "skip"
-r, --recursive Equivale a --directories=recurse
-R, --dereference-recursive
Simile al precedente, ma segue i collegamenti
simbolici
--include=MODELLO Esamina i file corrispondenti al MODELLO
--exclude=MODELLO Salta i file corrispondenti al MODELLO
--exclude-from=FILE Salta i file corrispondenti ai modelli nel FILE
--exclude-dir=MODELLO Salta le directory corrispondenti al MODELLO
-L, --files-without-match Stampa solo i nomi dei FILE senza corrispondenze
-l, --files-with-matches Stampa solo i nomi dei FILE contenenti corrispondenze
-c, --count Stampa solo il conteggio delle righe occorrenti in ogni
FILE
-T, --initial-tab Allinea le tabulazioni (se necessario)
-Z, --null Stampa il byte 0 dopo ogni nome di FILE
Controllo del contesto:
-B, --before-context=NUM Stampa NUM righe di contesto precedente
-A, --after-context=NUM Stampa NUM righe di contesto seguente
-C, --context=NUM Stampa NUM righe di contesto dell'output
-NUM Come --context=NUM
--color[=QUANDO],
--colour[=QUANDO] Usa i colori per distinguere le stringhe
corrispondenti; QUANDO può essere "always", "never"
o "auto"
-U, --binary Non rimuove i caratteri CR all'EOL (MSDOS/Windows)
-u, --unix-byte-offsets Segnala gli offset come se non ci fossero CR
(MSDOS/Windows)
"egrep" significa "grep -E", "fgrep" significa "grep -F".
L'invocazione diretta come "egrep" o "fgrep" è deprecata.
Se FILE è -, legge lo standard input, se non c'è alcun FILE legge . se è stata
passata l'opzione -r altrimenti -. Se sono stati specificati meno di due FILE
presume -h. Esce con lo stato 0 se è stata selezionata almeno una riga, 1
altrimenti. Se si verifica un errore e l'opzione -q non è stata usata, lo stato
è 2.
Cercare un file nel sistema.
Abbiamo visto come cercare una parola all’interno di un file, anche se non conosciamo esattamente quale sia il file che la contenga. Può essere invece che dobbiamo cercare un file poiché conosciamo il suo nome, o almeno parte di esso. Esistono sostanzialmente due strumenti locate e find.
Locate di fatto cerca all’interno del db di sistema, preparato dall’istruzione updatedb, che crea una indicizzazione. L’accuratezza delle informazioni dipende dall’aggiornamento di questo database, che in media risponde allo stato delle cose.
locate nomefile
a differenza di grep l’utilizzo delle espressioni regolari non è consentito. Può essere esclusa l’estensione del file, ovvero cercare nomefile e nomefile.ext è quasi la stessa cosa (ovvero nel caso il risultato ritorni troppi risultati è utile indicare anche l’estensione file) mentre se dobbiamo cercare un file di cui conosciamo solo l’inizio, o parte del file, dobbiamo utilizzare l’opzione -b
locate -b mefi
dove il “mefi” dell’esempio sarà una parte di nomefile.
Altre opzioni di locate sono:
Usage: locate [OPTION]... [PATTERN]...
Search for entries in a mlocate database.
-A, --all only print entries that match all patterns
-b, --basename match only the base name of path names
-c, --count only print number of found entries
-d, --database DBPATH use DBPATH instead of default database (which is
/var/lib/mlocate/mlocate.db)
-e, --existing only print entries for currently existing files
-L, --follow follow trailing symbolic links when checking file
existence (default)
-h, --help print this help
-i, --ignore-case ignore case distinctions when matching patterns
-l, --limit, -n LIMIT limit output (or counting) to LIMIT entries
-m, --mmap ignored, for backward compatibility
-P, --nofollow, -H don't follow trailing symbolic links when checking file
existence
-0, --null separate entries with NUL on output
-S, --statistics don't search for entries, print statistics about each
used database
-q, --quiet report no error messages about reading databases
-r, --regexp REGEXP search for basic regexp REGEXP instead of patterns
--regex patterns are extended regexps
-s, --stdio ignored, for backward compatibility
-V, --version print version information
-w, --wholename match whole path name (default)
Utilizzando find possiamo arrivare all’incirca sullo stesso risultato.
find cartella/nomef*
Simile a locate, stiamo cercando tutti i file che iniziano per nomef all’interno della directory cartella.
Se vogliamo cercare a livello globale (quindi non conosciamo la cartella dove potrebbe essere il nostro file) possiamo concatenare il comando grep che abbiamo visto in precedenza.
sudo find / | grep nomefile
In questo caso utilizzeremo l’istruzione sudo, per elevare il comando all’utente root poiché se utilizzassimo il nostro utente molte cartelle ci sarebbero precluse per mancanza di permessi.
Se invece desideriamo trovare una cartella e non il file possiamo indicare l’opzione “-type d” e “-name”
sudo find / -type d -name 'nomecartella'
Cercare un file in base alla sua dimensione.
Fino ad ora abbiamo visto esempi che presuppongono la richiesta, seppur parziale, di un nome o di un pattern da cercare. Negli esempi che andiamo ad effettuare invece cercheremo dei file di cui non conosciamo ne il nome ne il contenuto, ma li andremo a discriminare in base alla loro dimensione. In sostanza possiamo rispondere alla classica domanda “quali sono i file che occupano più spazio?“.
sudo find / -size +1G
in questo esempio andremo a trovare nell’intero sistema tutti i file che hanno una dimensione maggiore di un Gigabyte. L’opzione -size permette ad esempio di indicare la dimensione in vari modi, ad esempio +1073741824b oppure +1024k sono identici a +1G
Spingiamoci oltre, vogliamo cercare i file che sono compresi tra 1 e 2 Giga:
sudo find / -size +1G -size +2G
Un altro comando che può essere utilizzato per conoscere lo spazio utilizzato e du (disk usage).
du -h -a -t 1G /nomecartella
du in realtà è ottimo per cercare le cartelle (e non esclusivamente i file) che hanno un peso complessivo importante, quindi non necessariamente composte da file di grosse dimensioni, ma magari da tantissimi file piccoli.
du -h -S -t 1G /nomecartella
le opzioni -h (human readable) -S (summarize) e -t (range) raggiungono lo scopo prefissato di trovare tutte le cartelle il cui contenuto, indipendentemente dalla dimensione dei file contenuti, abbia un totale pari o superiore ad 1 Gigabyte.
Maggiori informazioni con il comando:
man du
du --help
Cercare in base alla data.
Dopo aver visto come cercare per dimensione del file, possiamo provare a rispondere ad un altra esigenza classica, trovare i file modificati dopo una certa data.
sudo find / -mmin 45
cercheremo tutti i file che sono stati modificati gli ultimi 45 minuti. Se al posto di -mmin utilizziamo -mtime passiamo dalla ricerca per giorni.
sudo find / -mtime 15
significa cercare i file modificati (per l’ultima volta) 15 giorni fa.
Cercare in base ai permessi.
Find permette, tra le tantissime opzioni, anche di cercare i file che abbiamo determinati permessi, ad esempio vogliamo elencare tutti i file con permesso 777 all’interno di un webserver:
find /path/webserver -perm 777
Si rimanda al comando “man find” per visionare le tantissime opzioni che non abbiamo elencato qui per brevità.
Conclusioni.
Cercare qualcosa su Linux è piuttosto semplice. Considerando che le informazioni che avete visto possano anche essere scriptate via Bash, o coma Alias all’interno della shell di Linux, ci permetteranno di poterle riutilizzare qual’ora necessitiamo di effettuare spesso un determinato tipo di operazione.