Introduzione
Uno dei problemi che gli utenti incontrano quando hanno a che fare per la prima volta con una macchina Linux è come trovare i file che stanno cercando.
Questa guida copre come usare il comando find
, giustamente nominato. Questo vi aiuterà a cercare i file sul vostro VPS usando una varietà di filtri e parametri. Tratteremo anche brevemente il comando locate
, che può essere usato per cercare i file in un modo diverso.
Ricerca per nome
Il modo più ovvio di cercare i file è per nome.
Per trovare un file per nome, digitare:
- find -name "query"
Questo sarà sensibile al maiuscolo/minuscolo, il che significa che una ricerca per file
è diversa da una ricerca per File
.
Per trovare un file per nome, ma ignorare il caso della query, digitate:
- find -iname "query"
Se volete trovare tutti i file che non aderiscono a un modello specifico, potete invertire la ricerca con -not
o !
. Se usi !
, devi fare l’escape del carattere in modo che bash non cerchi di interpretarlo prima che find possa agire:
- find -not -name "query_to_avoid"
Or
- find \! -name "query_to_avoid"
Finding by Type
Puoi specificare il tipo di file che vuoi trovare con il parametro -type
. Funziona così:
- find -type type_descriptor query
Alcuni dei descrittori più comuni che puoi usare per specificare il tipo di file sono qui:
-
f: file regolare
-
d: directory
-
l: link simbolico
-
c: dispositivi a carattere
-
b: block devices
Per esempio, se volessimo trovare tutti i dispositivi a carattere sul nostro sistema, potremmo lanciare questo comando:
- find / -type c
Output/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .
Possiamo cercare tutti i file che finiscono in .conf
in questo modo:
- find / -type f -name "*.conf"
Output/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .
Filtraggio per tempo e dimensione
Find vi offre una varietà di modi per filtrare i risultati per dimensione e tempo.
Dimensione
Puoi filtrare per dimensione con l’uso del parametro -size
.
Aggiungiamo un suffisso alla fine del nostro valore che specifica come stiamo contando. Queste sono alcune opzioni popolari:
-
c: bytes
-
k: Kilobyte
-
M: Megabyte
-
G: Gigabyte
-
b: Blocchi da 512 byte
Per trovare tutti i file che sono esattamente 50 byte, digitare:
- find / -size 50c
Per trovare tutti i file meno di 50 byte, possiamo invece usare questa forma:
- find / -size -50c
Per trovare tutti i file più di 700 Megabyte, possiamo usare questo comando:
- find / -size +700M
Time
Linux memorizza dati temporali sui tempi di accesso, di modifica e di cambiamento.
-
Tempo di accesso: Ultima volta che un file è stato letto o scritto.
-
Tempo di modifica: Ultima volta che il contenuto del file è stato modificato.
-
Change Time: Ultima volta che i meta-dati dell’inode del file sono stati cambiati.
Possiamo usarli con i parametri -atime
, -mtime
, e -ctime
. Questi possono usare i simboli più e meno per specificare maggiore o minore di, come abbiamo fatto con la dimensione.
Il valore di questo parametro specifica quanti giorni fa vorresti cercare.
Per trovare i file che hanno un tempo di modifica di un giorno fa, digitate:
- find / -mtime 1
Se vogliamo i file a cui si è avuto accesso meno di un giorno fa, possiamo digitare:
- find / -atime -1
Per ottenere i file le cui ultime informazioni meta sono state modificate più di 3 giorni fa, digitate:
- find / -ctime +3
Ci sono anche alcuni parametri di accompagnamento che possiamo usare per specificare minuti invece di giorni:
- find / -mmin -1
Questo darà i file che sono stati modificati tipo il sistema nell’ultimo minuto.
Find può anche fare confronti con un file di riferimento e restituire quelli che sono più recenti:
- find / -newer myfile
Ricerca per proprietario e autorizzazioni
Puoi anche cercare i file in base al proprietario del file o al proprietario del gruppo.
Lo fai usando rispettivamente i parametri -user
e -group
. Trovate un file di proprietà dell’utente “syslog” digitando:
- find / -user syslog
Similmente, possiamo specificare i file di proprietà del gruppo “shadow” digitando:
- find / -group shadow
Possiamo anche cercare file con permessi specifici.
Se vogliamo far corrispondere un insieme esatto di permessi, usiamo questa forma:
- find / -perm 644
Questo corrisponderà ai file con esattamente i permessi specificati.
Se vogliamo specificare qualsiasi cosa con almeno quei permessi, si può usare questa forma:
- find / -perm -644
Questo corrisponderà a qualsiasi file che ha permessi aggiuntivi. Un file con permessi “744” verrebbe abbinato in questo caso.
Filtraggio per profondità
Per questa sezione, creeremo una struttura di directory in una directory temporanea. Conterrà tre livelli di directory, con dieci directory al primo livello. Ogni directory (inclusa la directory temporanea) conterrà dieci file e dieci sottodirectory.
Fate questa struttura dando i seguenti comandi:
- cd
- mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
- touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
- cd ~/test
Sentitevi liberi di controllare le strutture di directory con ls
e cd
per avere un’idea di come sono organizzate le cose. Quando hai finito, torna alla directory di prova:
- cd ~/test
Lavoreremo su come restituire file specifici da questa struttura. Proviamo prima un esempio con una normale ricerca per nome, per confronto:
- find -name file1
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .
Ci sono molti risultati. Se convogliamo l’output in un contatore, possiamo vedere che ci sono 1111 risultati totali:
- find -name file1 | wc -l
Output1111
Questi sono probabilmente troppi risultati per essere utili nella maggior parte delle circostanze. Proviamo a restringere il campo.
Puoi specificare la profondità massima della ricerca sotto la directory di primo livello:
- find -maxdepth num -name query
Per trovare “file1” solo nelle directory di “livello1” e superiori, puoi specificare una profondità massima di 2 (1 per la directory di primo livello, e 1 per le directory di livello1):
- find -maxdepth 2 -name file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
Questa è una lista molto più gestibile.
Puoi anche specificare una directory minima se sai che tutti i file esistono oltre un certo punto sotto la directory corrente:
- find -mindepth num -name query
Possiamo usarlo per trovare solo i file alla fine dei rami della directory:
- find -mindepth 4 -name file
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .
Anche in questo caso, a causa della nostra struttura di directory ramificata, questo restituirà un gran numero di risultati (1000).
Puoi combinare i parametri di profondità min e max per concentrarti su un intervallo ristretto:
- find -mindepth 2 -maxdepth 3 -name file
Output./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .
Eseguire e combinare i comandi Find
Puoi eseguire un comando helper arbitrario su tutto ciò che trova usando il parametro -exec
. Questo è chiamato così:
- find find_parameters -exec command_and_params {} \;
Il {}
è usato come segnaposto per i file che trovano corrispondenza. Il \;
è usato in modo che find sappia dove finisce il comando.
Per esempio, potremmo trovare i file nella sezione precedente che hanno i permessi 644
e modificarli per avere i permessi 664
:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
Potremmo poi cambiare i permessi della directory in questo modo:
- find . -type d -perm 755 -exec chmod 700 {} \;
Se vuoi concatenare diversi risultati, puoi usare i comandi -and
o -or
. Il -and
viene assunto se omesso.
- find . -name file1 -or -name file9
Trova i file usando Locate
Un’alternativa all’uso di find
è il comando locate
. Questo comando è spesso più veloce e può cercare l’intero file system con facilità.
Puoi installare il comando su Debian o Ubuntu con apt
:
- sudo apt install mlocate
Su CentOS, usa invece dnf
:
- sudo dnf install mlocate
La ragione per cui locate
è più veloce di find
è perché si basa su un database dei file sul filesystem.
Il database viene solitamente aggiornato una volta al giorno con uno script cron, ma puoi aggiornarlo manualmente digitando:
- sudo updatedb
Esegui questo comando ora. Ricorda, il database deve essere sempre aggiornato se vuoi trovare file recentemente acquisiti o creati.
Per trovare file con locate, usa semplicemente questa sintassi:
- locate query
Puoi filtrare l’output in alcuni modi.
Per esempio, per restituire solo i file che contengono la query stessa, invece di restituire tutti i file che hanno la query nelle directory che portano ad essa, potete usare il -b
per cercare solo il “nome base”:
- locate -b query
Per far sì che locate restituisca solo i risultati che esistono ancora nel filesystem (che non sono stati rimossi tra l’ultima chiamata updatedb
e quella attuale locate
), usate il flag -e
:
- locate -e query
Per vedere le statistiche sulle informazioni che locate ha catalogato, usate l’opzione -S
:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Conclusione
Entrambi find e locate sono buoni modi per trovare file sul vostro sistema. Sta a te decidere quale di questi strumenti è appropriato in ogni situazione.
Trova e individua sono comandi potenti che possono essere rafforzati combinandoli con altre utilità attraverso le pipeline. Sperimentate il filtraggio usando comandi come wc
, sort
e grep
.