Site icon Tosolini.info

Guida ai comandi Linux: cercare

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.

Exit mobile version