Due domande diverse: dove sta questo file, e dove dovrebbe stare. Alla prima rispondono quattro comandi che si somigliano ma non coincidono; alla seconda uno standard che quasi tutti rispettano.
La mappa: la Filesystem Hierarchy Standard
La FHS stabilisce quale directory serve a cosa: non è obbligatoria, ma la seguono quasi tutti.
/bin,/sbin,/lib: binari e librerie essenziali, presenti anche prima che/usrsia montato;/sbinè per l’amministratore./usr: tutto il resto del software (/usr/bin,/usr/sbin,/usr/lib,/usr/share), condivisibile e in sola lettura;/usr/localper ciò che compili tu./etc: configurazione specifica di questa macchina, in file di testo, senza binari./var: dati che cambiano da soli —/var/log, code di stampa, cache, mailbox./homeper gli utenti,/rootper l’amministratore, che non sta sotto/home./bootkernel e initrd,/devi device,/proce/sysfilesystem virtuali,/optpacchetti di terze parti,/srvdati serviti verso l’esterno./mediaper i supporti rimovibili montati dall’utente,/mntcome montaggio temporaneo per l’amministratore: scambiarli è un errore d’esame classico.
Tre posti per i file temporanei, da distinguere: /tmp può essere svuotato all’avvio, /var/tmp non va svuotato e sopravvive ai riavvii, /run tiene i dati di runtime dei processi (i file .pid) e deve essere svuotato all’avvio; su parecchi sistemi /var/run è un link simbolico a /run.
Differenze fra famiglie: dove /usr è unificato — Fedora e RHEL da anni, ormai anche Debian e Ubuntu — /bin è un link simbolico a /usr/bin, ma la FHS descrive ancora la separazione e l’esame la chiede così. Il log generale è /var/log/messages sulle Red Hat, /var/log/syslog sulle Debian.
find: cercare davvero, adesso, sul disco
find percorre l’albero adesso, sul disco: punto di partenza, criteri, azione.
$ find /home -name '*.jpg'
$ find . -iname '*report*' -type f
$ find /var/log -maxdepth 1 -mtime -1
Gli apici attorno al modello servono, altrimenti è la shell a espandere l’asterisco prima che find lo veda. -name distingue maiuscole e minuscole, -iname no; -type accetta f, d e l. Per limitare il campo: -maxdepth 1 è “solo qui”, -mindepth N fa l’opposto, -mount non entra nei filesystem montati, -fstype ext4 restringe a un tipo.
Fra gli attributi: -user, -group, -empty, -readable, -writable, -executable. Sui permessi le forme sono tre: -perm 644 significa esattamente 644, -perm -644 significa almeno quei bit (anche 664 o 755 corrispondono), -perm /6000 significa almeno uno fra quei bit. Da qui il controllo di sicurezza classico, find / -perm -4000 -type f, che elenca i binari SUID.
Dimensione e tempo sono i criteri più insidiosi. -size senza suffisso conta blocchi da 512 byte; i suffissi sono c byte, k KiB, M MiB, G GiB, e il valore è arrotondato per eccesso, per cui -size 1M non trova quasi mai niente: usa + e -. -mtime conta periodi di 24 ore e -mmin minuti; la lettera dice cosa: a accesso, m modifica del contenuto, c cambio di metadati, permessi compresi.
$ find . -mtime -1 -size +100M
$ find /tmp -type f -atime +30 -delete
$ find . -name '*.log' -exec gzip {} \;
I criteri in fila sono in AND implicito; -o è l’OR, ! la negazione, e le parentesi vanno protette dalla barra rovesciata. Le azioni sono -print, sottintesa, -delete e -exec: con \; il comando parte una volta per file, con + più file entrano in una sola invocazione.
locate e updatedb: veloce, ma vecchio di un giorno
locate non guarda il disco: interroga un database costruito da updatedb. È istantaneo, ma vede il mondo com’era all’ultimo aggiornamento: non trova i file di stamattina e può mostrarne di già cancellati.
$ locate -i .jpg # ignora maiuscole e minuscole
$ locate -c .jpg # conta invece di elencare
$ locate -e report # solo file che esistono ancora
$ locate -A .jpg .zip # tutti i modelli devono corrispondere
Cerca sottostringhe nel percorso, non estensioni: locate jpg restituisce anche jpg_specs.doc. Il database si aggiorna a mano con updatedb, da root, e il sistema lo rilancia periodicamente per conto suo.
Il file da ricordare è /etc/updatedb.conf, una variabile per riga: PRUNEFS= i tipi di filesystem da non scandire, PRUNENAMES= i nomi di directory da saltare, PRUNEPATHS= i percorsi da saltare, PRUNE_BIND_MOUNTS= sì o no per i bind mount. Questi quattro nomi vanno saputi scritti esatti. L’implementazione classica è mlocate, con database in /var/lib/mlocate.db: è la risposta attesa all’esame, ma sui sistemi recenti trovi spesso plocate.
which, type, whereis: tre risposte diverse
which comandocerca solo nel PATH e stampa il percorso dell’eseguibile;-amostra tutte le corrispondenze. Non conosce alias, funzioni e comandi interni della shell.type comandoè un comando interno di bash e dice cosa verrà eseguito davvero:-tstampa la sola categoria fraalias,keyword,function,builtinefile.whereis comandocerca in percorsi standard fissi e restituisce binario, pagina di manuale e sorgenti;-b,-me-slimitano a una delle tre.
$ which bash
/usr/bin/bash
$ type -t ll
alias
$ whereis -m locate
locate: /usr/share/man/man1/locate.1.gz
Se un comando sembra non esistere ma tu sai che c’è, la causa è quasi sempre il PATH: echo $PATH mostra dove la shell cerca. Quando which e la realtà non concordano, fidati di type: su alcune distribuzioni which vede anche gli alias di shell, su altre no.