Espressioni di find : test
I primi due test sono molto semplici da capire: -false restituisce solo il valore falso, mentre -true restituisce
solo il valore vero. Altri test che non hanno bisogno della specifica di un valore sono -empty , che restituisce il valore
vero se il file è vuoto, e la coppia -nouser / -nogroup , che restituiscono il valore vero se nessuna
voce di /etc/passwd o /etc/group corrisponde all'id di utente/gruppo del proprietario del file; è
una cosa comune che accade nei sistemi multiutente: viene cancellato un utente, ma nei posti più strani del filesystem restano
suoi file, e per la legge di Murphy occupano un sacco di posto.
Naturalmente, è possibile ricercare un utente o un gruppo specifico. I test sono -uid nn e -gid
nn. Sfortunatamente non è possibile dare direttamente il nome dell'utente, ma bisogna usare l'id numerico, nn.
È possibile usare le forme +nn, che sta per "un valore strettamente maggiore di nn" e -nn, che
sta per "un valore strettamente minore di nn";è piuttosto stupido nel caso degli UID, ma sarà comodo
con altri test.
Un'altra opzione utile è -type c , che restituisce il valore vero se il file è di tipo c. Le corrispondenze
mnemoniche per le scelte possibile sono le stesse che in ls ; quindi si ha b per i file block special, c per
quelli character special, d per le directory, p per le pipe con nome, l per i link simbolici, e s per le
socket. I file regolari sono indicati con una f. Un test correlato è -xtype , che è simile a -type
tranne nel caso dei link simbolici. Se non è stato dato -follow , il file a cui si punta viene controllato al posto
del link stesso. Completamente scorrelato è il test -fstype tipo; in questo caso viene controllato il filesystem.
Credo di aver preso questa informazione dal file /etc/mtab , quello che indica i filesystem che vengono montati; sono sicuro
che i tipi nfs, tmp, msdos ed ext2 vengono riconosciuti.
I test -inum nn e -links nn controllano se il file ha numero di inode nn o nn
link, mentre -size nn rende vero se il file ha allocato nn blocchi da 512 byte (beh, non precisamente: per
i file sparsi i blocchi non allocati vengono contati lo stesso). Dato che al giorno d'oggi i risultati di ls -s non vengono
sempre misurati in parti da 512 byte (Linux per esempio usa unità di 1K), è possibile appendere a nn il carattere
b per contare in byte, o k per contare in kilobyte.
I bit di permesso vengono controllati con il test -perm modalità. Se modalità non ha segno,
i bit di permesso dei file devono combaciare perfettamente. Un - che precede i bit significa che tutti i bit di
permesso devono essere impostati, ma non fa assunzioni sugli altri; un + è soddisfatto se uno qualsiasi dei
bit è impostato. Ops! Mi dimenticavo di dire che la modalità è scritta in ottale o simbolicamente, come
si fa in chmod .
Il prossimo gruppo di test è correlato all'ora di ultimo utilizzo del file; è comodo quando un utente ha riempito il
suo spazio, e come al solito ci sono moltissimi file inutilizzati da anni, e di cui si è dimenticato il significato. Il problema
è trovarli, e find è l'unica speranza. -atime nn rende vero se il file è stato
utilizzato nn giorni fa (ad esempio, con un comando chmod) e -mtime nn se il file è stato modificato
per l'ultima volta nn giorni fa. Talvolta si ha bisogno di un tempo più preciso; il test newer file
è soddisfatto se il file considerato è stato modificato dopo file. Quindi, dovete semplicemente usare touch
con la data desiderata, ed avete fatto. Il find della GNU aggiunge i test -anewer e -cnewer che si comportano
in maniera simile, ed i test -amin , -cmin e -mmin , che contano il tempo in minuti invece che
in periodi di 24 ore.
Per ultimo, il test che uso più spesso: -name pattern rende vero se il nome del file corrisponde esattamente
a pattern, che è più o meno quello che si usa in un ls standard. Perché "più o
meno"? Perché naturalmente dovete ricordare che tutti i parametri sono processati dalla shell, e quei bei metacaratteri
vengono espansi. Quindi, un test come -name foo* non renderà quello che volete, e dovreste scrivere o -name
foo o -name "foo*" . Questo è probabilmente uno degli errori più comuni fatti dagli utenti
disattenti, quindi scrivetelo a lettere GRANDI sul vostro schermo. Un altro problema è che, come con ls , i punti
all'inizio non vengono riconosciuti; per questo potete usare il test -path pattern, che non si preoccupa dei punti
e delle barre quando paragona il percorso del file considerato con pattern.
|