Salta al contenuto principale

rm: elimina file e directory (senza cestino)

Inviato da tuxsa il

rm elimina file e cartelle dal terminale. È il comando più semplice da usare e il più rischioso della serie: non esiste nessun cestino, e ciò che cancelli non si recupera con un semplice "annulla". Vale la pena imparare bene come funziona, prima di usarlo con leggerezza.

Cos'è

rm è l'abbreviazione di remove, "rimuovi". Fa parte del pacchetto GNU coreutils ed è un eseguibile (/usr/bin/rm), presente su qualsiasi distribuzione GNU/Linux.

Cosa fa

Elimina i riferimenti ai file indicati: da quel momento il sistema considera libero lo spazio che occupavano. Non sposta i file in una cartella temporanea e non chiede conferma, a meno che tu non lo richieda con le opzioni giuste. Recuperare i dati dopo un rm è in generale difficile e non garantito, e richiede strumenti specifici e subito.

Per impostazione predefinita rm non elimina le directory: servono l'opzione -r oppure il comando rmdir.

Come si usa

Sintassi base:

$ rm [opzioni] file...

Esempio 1: eliminare un file

$ ls
appunti.txt  bozza.txt
$ rm bozza.txt
$ ls
appunti.txt

In caso di successo rm non stampa nulla, e il file è già sparito.

Esempio 2: eliminare più file

$ rm prova1.txt prova2.txt prova3.txt
$ rm *.tmp

Il carattere jolly * viene espanso dalla shell in tutti i file che finiscono per .tmp. Prima di usarlo con rm, guarda cosa verrebbe cancellato, eseguendo lo stesso schema con ls:

$ ls *.tmp
cache.tmp  vecchio.tmp
$ rm *.tmp

Esempio 3: chiedere conferma con -i

$ rm -i appunti.txt
rm: rimuovere il file regolare 'appunti.txt'? n

Con y il file viene eliminato, con n resta dov'è. È l'opzione giusta quando lavori in fretta o con nomi simili.

Esempio 4: eliminare una directory con -r

Senza -r, rm si rifiuta:

$ rm Vecchi
rm: impossibile rimuovere 'Vecchi': è una directory
$ rm -r Vecchi

L'opzione -r (recursive) elimina la directory e tutto ciò che contiene, sottocartelle comprese.

Esempio 5: eliminare solo directory vuote

Per le directory vuote c'è un comando dedicato, molto più sicuro, perché fallisce se la cartella contiene qualcosa:

$ rmdir Vuota
$ rmdir Piena
rmdir: rimozione di 'Piena' non riuscita: La directory non è vuota

Anche rm -d elimina le directory vuote.

Esempio 6: ignorare gli errori con -f

$ rm -f file_che_forse_non_esiste.txt

L'opzione -f (force) non chiede conferme e non segnala errori se il file non esiste. Negli script si usa spesso per rendere un comando "ripetibile". Fa però anche un'altra cosa: elimina senza chiedere i file protetti da scrittura, per i quali rm normalmente chiederebbe conferma.

Esempio 7: vedere cosa viene eliminato con -v

$ rm -rv Vecchi
rimosso 'Vecchi/note.txt'
rimosso 'Vecchi/lista.txt'
rimossa la directory 'Vecchi'

Esempio 8: una conferma sola con -I

Con -I (maiuscola) rm chiede conferma una volta sola, e solo se stai per eliminare più di tre file o una directory in modo ricorsivo. È meno fastidioso di -i e protegge comunque dalle distrazioni più gravi:

$ rm -I *.log
rm: rimuovere 5 argomenti? n

Esempio 9: nomi con spazi o che iniziano con un trattino

I nomi con spazi vanno tra virgolette, altrimenti ogni parola viene trattata come un file diverso:

$ rm "Bozza articolo.txt"

Un file il cui nome inizia con - verrebbe scambiato per un'opzione. Il doppio trattino -- indica che le opzioni sono finite:

$ rm -- -file_strano.txt

Esempio 10: uso negli script, con una protezione

Questo script svuota una cartella di lavoro dai file temporanei:

#!/bin/bash
TMP="$HOME/lavoro_temp"

# se TMP fosse vuota, ${TMP:?} blocca lo script con un errore
rm -f "${TMP:?variabile non impostata}"/*.tmp
echo "Pulizia completata"

La sintassi ${TMP:?messaggio} interrompe lo script se la variabile è vuota o non definita. Senza di essa, un comando come rm -rf "$TMP"/* con la variabile vuota diventerebbe rm -rf /*.

Opzioni utili

  • -i: chiede conferma per ogni file.
  • -I: chiede conferma una volta sola per operazioni di una certa portata.
  • -r / -R: elimina le directory e il loro contenuto.
  • -f: non chiede conferme e ignora i file inesistenti.
  • -d: elimina le directory vuote.
  • -v: mostra ogni elemento eliminato.

Attenzione a

  • Nessun cestino, nessun annulla: l'eliminazione è definitiva. Se vuoi una rete di sicurezza, sulle distribuzioni con desktop GNOME puoi usare gio trash file, oppure installare trash-cli e usare trash-put file: spostano il file nel cestino invece di cancellarlo.
  • rm -rf è il comando più pericoloso: elimina ricorsivamente senza chiedere nulla. Controlla due volte il percorso prima di premere Invio.
  • Lo spazio di troppo: rm -rf /home/enzo/Documenti e rm -rf /home/enzo /Documenti sono comandi molto diversi. Nel secondo caso elimini l'intera home, e poi provi a eliminare /Documenti.
  • Variabili vuote: in uno script, rm -rf "$DIR"/* con DIR non impostata diventa rm -rf /*. Proteggiti con ${DIR:?}.
  • I caratteri jolly: rm * elimina tutto nella directory corrente. Verifica sempre prima con pwd dove sei e con ls cosa c'è.
  • La protezione della radice: GNU rm rifiuta di eseguire rm -rf / (opzione --preserve-root, attiva di default), ma non protegge da varianti come rm -rf /*.
  • Permessi: per eliminare un file serve il permesso di scrittura sulla directory che lo contiene, non sul file stesso.
  • Non è una cancellazione sicura: rm libera lo spazio ma non sovrascrive i dati. Per eliminare in modo davvero irrecuperabile serve altro, e anche gli strumenti dedicati come shred non sono affidabili su SSD e file system con journaling.

Riepilogo

ComandoCosa fa
rm fileElimina un file
rm -i fileChiede conferma prima di eliminare
rm -I *.logUna sola conferma per operazioni estese
rm -r dirElimina una directory e il contenuto
rmdir dirElimina una directory solo se vuota
rm -f fileElimina senza chiedere e senza errori
rm -v fileMostra cosa viene eliminato
gio trash fileSposta nel cestino invece di cancellare