Comando rm in Linux: eliminare file e directory e verificare i percorsi
rm elimina file e, con -r, directory con il loro contenuto, normalmente senza passare dal cestino. Prima di eseguirlo controlla il percorso e gli elementi selezionati: le richieste di conferma aiutano a evitare errori, ma non offrono una funzione di annullamento.
Gli esempi si riferiscono a GNU Coreutils. Controlla rm --help e man rm sul sistema di destinazione: opzioni come -I, --one-file-system e --preserve-root sono estensioni GNU e non sono disponibili in ogni implementazione.
Cos'è il comando rm?
rm rimuove il nome che collega un file alla sua directory. Non sovrascrive automaticamente i dati del file e non garantisce né il recupero né la cancellazione sicura del contenuto. Senza un’opzione per le directory, non elimina directory; con -r visita l’albero e ne rimuove il contenuto prima delle directory stesse.
Sintassi di base
rm [OPTION]... FILE...
Racchiudi tra virgolette i percorsi con spazi. Con GNU rm -- -temporary.txt, -- termina le opzioni: il nome successivo viene trattato come percorso anche se inizia con un trattino. La sintassi precedente contiene segnaposto e non è un comando da eseguire letteralmente.
Uso base di rm
Rimuovere un file
Lavora in una directory di prova nuova: esegui mkdir rm-demo && cd rm-demo solo se rm-demo non esiste già; se la preparazione fallisce, fermati. Crea due file dimostrativi con printf "vecchio\n" > old-report.txt e printf "temporaneo\n" > ./-temporary.txt. Le due righe seguenti li eliminano: dopo l’esecuzione nessuno dei due percorsi deve esistere.
rm old-report.txt
rm -- -temporary.txt
Rimuovere diversi file corrispondenti
Nella cartella di prova crea first.tmp, second.tmp e .hidden.tmp. La prima riga mostra i nomi selezionati, la seconda li elimina. Normalmente *.tmp è espanso dalla shell e non include il nome nascosto: .hidden.tmp rimane. Se non trova corrispondenze, Bash con le impostazioni predefinite passa il pattern letterale e rm segnala un errore. L’anteprima non blocca la directory: altre modifiche possono cambiare i nomi fra le due righe.
printf '%s\n' *.tmp
rm -- *.tmp
Rimuovere un albero di directory
Crea una struttura dimostrativa con mkdir -p build-cache/sub e inserisci un file di prova in build-cache/sub. find mostra fino a due livelli, mentre rm -r rimuove tutto l’albero, anche eventuali livelli più profondi: il limite dell’anteprima non limita la cancellazione. Usa la seconda riga solo dopo aver confermato che l’intero contenuto di build-cache è eliminabile.
find build-cache -maxdepth 2 -print
rm -r -- build-cache
Verificare una rimozione senza messaggi
Un’esecuzione riuscita normalmente non produce messaggi. Questa prova crea una nuova sottocartella e si interrompe se la preparazione o la rimozione fallisce; le parentesi mantengono invariata la directory della shell principale.
(
mkdir remove-check || exit 1
cd remove-check || exit 1
printf 'demo\n' > disposable-demo.txt || exit 1
rm -- disposable-demo.txt || exit 1
test ! -e disposable-demo.txt
echo $?
)
L’output atteso è 0: è il risultato di test ! -e disposable-demo.txt, che verifica l’assenza del percorso creato per la prova, non il codice originale di rm. Un codice di uscita pari a zero non dimostra sempre che ogni elemento sia stato eliminato: per esempio, il rifiuto di una conferma può lasciare il file senza produrre un errore. Controlla messaggi, stato di uscita e percorsi risultanti.
Opzioni principali
| Opzione | Scopo |
|---|---|
-r, -R |
Rimuove ricorsivamente directory e relativo contenuto. |
-i |
Chiede conferma prima di ogni rimozione. |
-I |
Chiede una sola conferma se gli operandi sono più di tre oppure se è richiesta la ricorsione. |
-f |
Ignora file inesistenti e assenza di operandi, senza chiedere conferma. Non aggira permessi o altri errori. |
-d |
Rimuove directory vuote, senza visitarne ricorsivamente il contenuto. |
-v |
Mostra i percorsi rimossi. |
--one-file-system |
Nella ricorsione salta directory su un filesystem diverso da quello del rispettivo operando iniziale. |
--preserve-root[=all] |
Per impostazione predefinita impedisce la rimozione ricorsiva di /. Con =all rifiuta anche operandi iniziali su un filesystem diverso da quello della directory genitrice. |
Per la portabilità confronta rm in POSIX.1-2024, che include anche -d e -v. In GNU, fra -i e -f prevale l’ultima opzione indicata. Le opzioni di protezione non sostituiscono la verifica del percorso.
Esempi pratici
Mostrare il percorso prima della rimozione
Per questa anteprima crea una nuova directory preview-demo con un file di prova. La variabile seguente ha un valore esplicito e viene racchiusa tra virgolette; il comando non elimina nulla. find deve mostrare preview-demo e il contenuto fino a due livelli. Nomi che contengono ritorni a capo possono rendere ambigua una lista per righe: per elaborazioni automatiche servono delimitatori appropriati, per esempio il carattere nullo, e controlli specifici.
target='preview-demo'
printf 'target=%s\n' "$target"
find "$target" -maxdepth 2 -print
Usare le conferme interattive
Prepara important.conf come file dimostrativo e old-release come directory di prova con un file. La prima riga chiede se eliminare il file; rispondi n per conservarlo. La seconda usa -I insieme alla ricorsione e chiede una sola conferma prima dell’intera operazione: n lascia l’albero invariato, y ne autorizza la rimozione. -I chiede conferma anche senza ricorsione quando gli operandi sono più di tre. Negli script convalida i percorsi senza dipendere dalle risposte a un prompt.
rm -i important.conf
rm -Ir old-release/
Evitare di attraversare filesystem montati
Le righe seguenti illustrano un percorso di sistema da adattare, non fanno parte del laboratorio e non vanno eseguite alla cieca. Secondo il manuale ufficiale di findmnt, findmnt --target identifica il filesystem che contiene il percorso, ma da solo non elenca tutti i mount annidati: controlla anche la struttura dei mount sotto /srv/chroot. La seconda riga elimina il contenuto di quel percorso e il percorso stesso, salvo errori o directory saltate. --one-file-system salta i filesystem diversi incontrati sotto ciascun operando iniziale; non protegge un mount passato direttamente come operando e non esclude un bind mount sullo stesso filesystem. Prima dell’uso verifica che ogni elemento raggiungibile debba davvero essere rimosso.
findmnt --target /srv/chroot
rm -r --one-file-system -- /srv/chroot
rm e comandi correlati
| Comando o metodo | Ruolo principale | Quando usarlo |
|---|---|---|
rm |
Eliminare nomi di file e alberi di directory | Rimozione dalla riga di comando senza cestino |
rmdir |
Eliminare soltanto directory vuote | Lasciare intatte le directory che contengono dati |
| Utilità del cestino | Spostare gli elementi nel cestino | Interazioni in cui è utile poter ripristinare gli elementi, secondo lo strumento usato |
shred |
Tentare di sovrascrivere i dati | Casi in cui filesystem e supporto permettono la sovrascrittura effettiva; non è una garanzia universale |
Un link simbolico contiene il percorso di un altro elemento. Se indichi il nome del link senza barra finale, rm rimuove il link stesso, non il suo destinatario; la ricorsione non segue i link simbolici incontrati nell’albero. Controlla comunque il percorso completo prima della rimozione.
Avvertenze importanti
Non utilizzare rm -rf per abitudine
-r estende l’operazione a tutto l’albero; -f elimina le conferme, ma non corregge un percorso sbagliato. Verifica che una variabile sia valorizzata e che il percorso risolto sia sotto la directory prevista. GNU protegge / dalla rimozione ricorsiva per impostazione predefinita; --preserve-root=all aggiunge il controllo del filesystem della directory genitrice. Queste protezioni non impediscono di eliminare un’altra directory importante scelta per errore.
Non fare affidamento su un alias come unica protezione
Un alias interattivo come rm -i può mancare negli script o su un altro sistema; un’opzione successiva può inoltre cambiare il comportamento. Usa controlli dei percorsi, privilegi limitati e backup verificati. In Linux la rimozione di un nome dipende in particolare dai permessi della directory che lo contiene e dalle ulteriori regole del filesystem: un file non scrivibile non è automaticamente impossibile da eliminare.
Non presumere un recupero facile
Il recupero è incerto e può diventare impossibile quando lo spazio viene riutilizzato. Prima di eliminare dati importanti verifica che il backup sia leggibile e ripristinabile. La rimozione di un nome non cancella altre copie, altri nomi collegati agli stessi dati (hard link) o backup e non equivale a una cancellazione sicura. Anche shred ha limiti: istantanee del filesystem (snapshot), scrittura su copia (copy-on-write), unità a stato solido (SSD) e copie di backup possono conservare dati che la sovrascrittura del file non raggiunge; il manuale GNU, sezione shred ne descrive le condizioni.
FAQ
Il comando rm invia i file nel cestino?
Normalmente no. rm elimina i nomi dalla directory senza usare il cestino del desktop e senza offrire un comando di annullamento.
Quale opzione rimuove una directory con il suo contenuto?
Usa -r dopo aver verificato tutto il contenuto. Se vuoi eliminare soltanto una directory vuota e conservare quelle non vuote, usa rmdir.
Qual è la differenza tra -i e -I?
-i chiede conferma per ogni rimozione. GNU -I chiede una sola conferma quando gli operandi sono più di tre oppure è richiesta la ricorsione; un rifiuto interrompe l’operazione.
Posso recuperare immediatamente un file eliminato con rm?
Non è garantito. Limita ulteriori scritture sul filesystem interessato e valuta il ripristino da backup o una procedura di recupero adatta a quel filesystem; continuare a scrivere può riutilizzare lo spazio liberato.




