Su Linux quasi tutto è un file, e questo obiettivo lo prende alla lettera: non chiede definizioni, chiede quale comando e quale opzione usi per creare, copiare, spostare e cancellare. Una parte delle domande d’esame è a completamento, senza risposte fra cui scegliere: qui la sintassi va ricordata esatta, non riconosciuta.

Guardare prima di toccare: ls e touch

ls da solo elenca i nomi della directory corrente. Le opzioni che contano sono quattro: -l per il formato lungo (permessi, proprietario, dimensione, data), -a per mostrare anche i file nascosti, cioè quelli il cui nome inizia con un punto, -h per dimensioni leggibili e -R per scendere ricorsivamente nelle sottodirectory.

$ ls -lh
drwxr-xr-x 2 frank frank 4.0K Apr  1  2018 Documents
-rw-r--r-- 1 frank frank   21 Sep  7 12:59 emp_name

Il primo carattere della riga è il tipo del file: - regolare, d directory, l link simbolico, b e c device a blocchi o a caratteri. Ricorda che -h ha senso solo insieme a -l, e che ls -d nomedir elenca la directory stessa invece del suo contenuto.

touch crea file vuoti e, se il file esiste già, non ne tocca il contenuto: ne aggiorna i tempi. Con -a cambi solo l’access time, con -m solo il modification time, con -t imposti una data arbitraria. È il modo più rapido di preparare file di prova.

$ touch file1 file2 file3
$ touch -m file3

Copiare e spostare: cp e mv

La forma è sempre cp SORGENTE DESTINAZIONE, con percorsi assoluti o relativi. Su una directory cp da solo si rifiuta e stampa omitting directory: serve -r (oppure -R o --recursive). Le altre opzioni da sapere sono -i, che chiede conferma prima di sovrascrivere, -f, che sovrascrive senza chiedere, e -p, che conserva permessi e timestamp dell’originale.

mv fa due lavori con la stessa sintassi: se la destinazione è una directory sposta, se è un nome nuovo rinomina. Non esiste un -r per mv, perché spostare una directory è un’operazione sola. Anche qui valgono -i e -f, più -n per non sovrascrivere mai.

⚠️ Trappola distribuzione: sulle famiglie Red Hat e Fedora l’utente root ha per default gli alias rm -i, cp -i e mv -i, mentre su Debian e Ubuntu no. Lo stesso comando quindi chiede conferma su una macchina e cancella in silenzio sull’altra. Per ignorare l’alias si scrive \rm oppure command rm.

Cancellare: rm e rmdir

rm elimina file e non chiede nulla, salvo -i. Per le directory servono -r (contenuto compreso) o -d (solo se vuota). rmdir cancella una directory solo se è vuota, e con -p risale rimuovendo anche le directory padre che restano vuote: è la differenza da ricordare rispetto a rm -r, che invece non guarda al contenuto.

$ rm -r vecchio_backup/
$ rmdir -p progetti/2018/gennaio

rm -rf su una directory di sistema rende la macchina inutilizzabile e non esiste cestino. Altra trappola classica: un file il cui nome inizia con un trattino viene letto come opzione. Si cancella con rm -- -file oppure rm ./-file.

I caratteri jolly li espande la shell, non il comando

Il globbing è lavoro della shell: prima che rm o cp partano, il pattern è già stato sostituito con l’elenco dei nomi che corrispondono. I metacaratteri sono tre: * per zero, uno o più caratteri qualsiasi, ? per un carattere singolo, e le parentesi quadre per un insieme o un intervallo, come in l[aef]st.txt, file[0-9].txt, [a-z]*. Un punto esclamativo subito dopo la quadra aperta nega l’insieme.

$ ls l?st.txt
$ ls student-[0-9][A-Z].txt
$ cp -r animal/* forest

Due conseguenze pratiche: * non corrisponde ai file nascosti, perché il punto iniziale va scritto esplicitamente; e se nessun nome corrisponde, la shell passa il pattern al comando così com’è, che di solito produce un errore poco chiaro.

find: cercare per tipo, dimensione e tempo

La sintassi è find PERCORSO_DI_PARTENZA CRITERI AZIONE, e il percorso viene per primo. I criteri d’esame sono -name (con -iname che ignora maiuscole e minuscole), -type f, -type d o -type l, -size e -mtime, più -maxdepth N per limitare la profondità. Nelle dimensioni il suffisso è c per byte, k, M, G; il segno cambia tutto: -size +100M significa più grande, -size -100M più piccolo, senza segno esattamente. Per -mtime il numero sono giorni: -mtime +7 è modificato da più di sette giorni, -mtime -7 da meno.

$ find /home/frank -name "*.png"
$ sudo find /var -type f -size +100M -size -1000M
$ find . -name "*.conf" -exec chmod 644 '{}' \;
$ find . -name "*.bak" -delete

⚠️ Il pattern va sempre fra virgolette, altrimenti lo espande la shell prima che find lo veda. E la forma di -exec è una di quelle da sapere a memoria: parentesi graffe come segnaposto del file trovato e punto e virgola finale protetto da backslash.