02/01/2007

Come Prevenire una Strage

Posted in Curiosità, Informatica, Linux, Tips&Tricks a 16:13:57 di JhacK

Vi è mai capitato sotto Linux di lanciare il comando “rm -rf *” pensando di essere in una directory, ma trovandovi in un’altra? Se sì, non sarete stati contenti di rimuovere i file sbagliati, immagino 🙂

 

Una prima soluzione è quella di ridefinire il comando “rm” come “rm -i” per il proprio utente in “~/.bashrc” o, a livello di sistema, in “/etc/profile”. Per le shell bash, Bourne e Korn è sufficiente inserire la seguente stringa nei suddetti file:

alias rm=’rm -i’

Questo approccio comporta che l’esecuzione del comando “rm” diventi interattiva, ovvero viene chiesta conferma all’utente per l’eliminazione di ciascun file, e, per quanto mi riguarda, è una cosa davvero odiosa, anche perché è abbastanza raro che mi accada di fare un danno simile :D.

È per questo motivo che vi propongo un’alternativa molto simpatica: consiste nell’introdurre nelle directory da “preservare” un file dal nome “-i“; con il comando touch si fa così:

touch — -i

Perché funziona? Lo spiego con un esempio: consideriamo di avere una directory contenente i file “a“, “b” e “c/” (questa è una directory) e di trovarsi in tale directory; il comando “rm -rf *” viene espanso come:

rm -rf a b c/

e causa la sicura rimozione dei tre file, compresa la directory, vista la presenza dell’opzione “-r“. Se si introduce il file “-i” il comando espanso diventa:

rm -rf -i a b c/

Tale espansione comporta che il nome del file venga interpretato come l’opzione “-i” di “rm”, rendendo la rimozione interattiva, riconducendoci al caso precedente.

 

Attenzione, c’è una fondamentale limitazione che forse avete potuto intuire: se il nome del file “-i” non compare nell’espansione del comando allora il gioco non funziona! Esempio: consideriamo che i file di prima si trovino nella directory “/public/prova/” e consideriamo di trovarci in tale directory; i seguenti comandi fanno danni:

rm -rf ./*

rm -rf ../prova/

rm -rf /public/prova/

Il motivo per cui ciò accade è per il semplice fatto che nel comando non compare il nome del file “-i”. Un consiglio generale è quello di evitare di lanciare il comando “rm -rf *” senza prima esservi accertati di essere nella directory giusta, ad esempio con “pwd“.

Per completezza, e per geek-eria, sottolineo un ulteriore potenziale problema: nel caso esistesse un file che avesse un nome tale da comparire nell’ordine alfabetico prima di “-i” il trucchetto non funzionerebbe, poiché “-i” non verrebbe considerata come un’opzione di “rm”, ma come il nome di un file. Provate creando il file “+”. Naturalmente chi utilizza certi nomi se la va a cercare!

Per qualsiasi informazione sui comandi utilizzati ricordo che esiste il sempre utile manuale, accessibile tramite il comando “man” seguito dal nome del comando di cui si vogliono dettagli (ad esempio, “man rm”, “man pwd”, ecc.).

Annunci

9 commenti »

  1. piccolopinguinopsicotico said,

    :O
    Sono senza parole, è semplicemente geniale!! Semplice, ma geniale 😉

  2. poluz said,

    Il problema è che queste cose ti vengono in mente dopo il danno, e quando metti il sistema per evitarlo, guarda caso, non succede mai più! Progetto di TWeb docet… 😛

  3. JhacK said,

    @poluz: mi aspettavo il tuo commento :P. Lì si è trattata di una concomitanza di cause, tra cui comandi scritti ad alta velocità ed una incomprensione con una shell modificata che mi ha portato a credere di essere dove in realtà non ero :P. In tutti i casi c’era un backup recentissimmo e salvare il tutto è costato il tempo di un download da GMail ed uno scompattamento. Vogliamo parlare di un tuo scompattamento alla cieca che ha fatto ben più danni‽ :D.

  4. S. said,

    Peraltro, mi avevi rirpoposto la cosa durante il periodo di TWeb… rimasi di merda all’inizio… poi ti ho mandato a cagare, credo ;-p Anche perché siamo partiti a fare testing sui possibili danni che si potevano fare anche avendo adottato quel trucco… in pratica avevamo perso una giornata…

  5. JhacK said,

    @S.: sinceramente non mi ricordo. Non ho capito una cosa: avete perso tempo per fare le prove o avete perso tempo perché, facendo le prove, avete arrecato dei danni al vostro progetto (o una combinazione lineare delle due casistiche) ? 😛

  6. ao2 said,

    E se si facesse un alias a mv (usando una function per trattare eventuali opzioni incompatibili e per gestire la dir di destinazione)?

    In questo modo si puo’ ricreare il meccanismo “cestino” e magari svuotare questo cestino usando un cronjob… e soprattutto lasciare pulito il filesystem da quel file -i che e’ efficace ma un po’ bruttino 😉

    Vabbe’ chissa’ quante altre soluzioni potremmo trovare 🙂

    Ciao ciao,
    Antonio.

  7. JhacK said,

    @ao2: che ricordi :D. Lo avevo fatto per un’esercitazione dell’esame di Sistemi Operativi, qualche anno fa. Si chiamava “saferm”: i file cancellati con “saferm” finivano in un cestino e venivano gestiti in un qualche modo che ora mi sfugge. In quel caso il comando era un altro e non un alias; comunque la mia idea è quella di non stravolgere il funzionamento dei comandi normali. E non vorrei che diventasse troppo Windows-like 😉

  8. king84 said,

    Hmmmm mi è capitato un paio di mesi fa in lab ercolani…. Macchina bloccata…… mitico comando rm -rf *
    ed è passata la paura di essere overquota 😦

  9. PV said,

    ieri ho per errore dato rm /* -rf
    ho battuto due tasti (tastierino) per errore.
    un secondo ed un server e’ andato giu’


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: