Eseguire comandi con find
Una delle caratteristiche interessanti di find è che permette di specificare cosa
fare con i file che vengono trovati. Ad esempio, è possibile chiedere di
cancellarli con il flag -delete
(da usare con parsimonia e con la
dovuta attenzione).
Una caratteristica molto potente è il flag -exec
, che permette di
eseguire un comando qualunque sui file che corrispondono alla ricerca scelta.
Ad esempio, supponiamo di voler eliminare i file modificati da
più di 10 giorni. Potremmo
usare il flag -delete
in questo modo (non eseguire quest due comandi, a meno
che non si vogliano davvero eliminare i propri file! È solo un esempio):
$ find . -mtime +10 -deleteoppure in maniera completamente equivalente combinare il flag
-exec
con il comando rm
. Ad esempio:
$ find . -mtime +10 -exec rm {} \;Il simbolo
{}
è un "segnaposto" per il percorso del file determinato da
find
, mentre \;
sta ad indicare la fine del comando. Il simbolo
che viene letto da find
è semplicemente un punto e virgola, ma è necessario
farlo precedere dal backslash perché la shell non lo interpreti.
Si utilizzi il comando
In alternativa è possibile, almeno accontentandosi di includere le directory, evitare del tutto
find
per creare una lista files-matricola.txt
di tutti i file sul
sistema dentro la cartella /usr
in cui l'inode contenga come sottostringa il proprio numero di matricola; si escludano
le cartelle, e si considerino solo i file regolari.
Nel caso (relativamente probabile) in cui questa lista fosse vuota, si considerino i file
in cui l'inode contiene le prima $k$ cifre del proprio numero di matricola, con $k$ il
minimo intero $< 6$ per cui la lista non è vuota. Alcuni suggermienti:
- Si può iniziare generando una lista di tutti gli inode combinando il flag
-exec
con il comandols -i
- Si può filtrare la lista precedente con il comando
grep
. In principio, questo presenta il rischio che vengano inclusi anche alcuni file per cui l'inode non è come richiesto, ma la sottostringa si trova all'interno del file. Sebbene questo sia possibile, lo riteniamo per il momento come sufficientemente improbabile. Si vedrà più avanti come si potrebbe raffinare questa ricerca. - Come primo prototipo, si provi a fare la lista degli inode dei file nella propria home, questo sarà incredibilmente più efficiente
ls
per ogni file sul sistema,
e questo non è molto efficiente (lo noterete dai tempi di esecuzione!). Se
i tempi dovessero essere troppo lunghi, restringere la ricerca ad una
cartella più piccola, come /usr/bin
. In alternativa è possibile, almeno accontentandosi di includere le directory, evitare del tutto
find
e utilizzare un ls
ricorsivo. Provare a guardare il manuale di ls
per capire come fare, e confrontare
i tempi di esecuzione.