Cosa ha 'rm -r ~' fatto nella mia home directory?

16

gedit crea file di backup nascosti che terminano con '~'. Volevo eseguire una pulizia ricorsiva del mio albero delle directory.

Il comando rm *~ cancellerà tutti i file locali che terminano con '~'

Ho pensato che rm -r *~ . avrebbe eliminato tutti i file nell'intero albero, ma ho digitato rm -r ~ .

C'era un messaggio che alcune directory non potevano essere cancellate e ho lasciato il comando. La domanda è: cosa ho eliminato?

Ho notato che la mia configurazione di Filezilla era sparita. Questo comando cancella tutte le directory nascoste dalla directory home?

    
posta GUI Junkie 29.06.2012 - 10:48

2 risposte

31

Hai cancellato (quasi) tutta la tua home directory!

rm -r something ricorsivamente cancella file e directory in / sotto qualcosa ; non funzionerà sugli elementi che non ha il permesso di eliminare, perché sono di proprietà di un utente diverso (ad esempio root ) o perché sono in uso (ad esempio un montaggio GVFS).

Se non hai aggiunto -f (come in, rm -rf something ), otterresti qualcosa del tipo:

rm: remove write-protected regular file ‘something’?
rm: descend into write-protected directory ‘something’?

A questo punto puoi abortire e probabilmente ti rendi conto che hai eseguito il comando sbagliato.

Suggerimenti della comunità su come evitare tali incidenti

  

Nota: wiki della comunità, tutti si sentono liberi di contribuire.

  • Per alcuni file, usa l'opzione -i per ottenere una conferma sulla rimozione di file o directory:

    $ rm -ri something/
    rm: remove regular file ‘something/file~’? y
    rm: descend into directory ‘something’? y
    rm: remove regular file ‘something/file’? y
    rm: remove directory ‘something’? y
    
  • Se rimuovi da una directory corrente, aggiungilo a ./ per evitare di rimuovere in modo errato una posizione diversa.

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’
    

    Quanto sopra era per dimostrare l'uso di ./ . Se c'è una sottodirectory, puoi ovviamente usare anche rm -v something/*~ . Attenzione : non pensare che rm ./.* rimuova tutti i file nascosti nella directory corrente. Vedi questa domanda Serverfault per soluzioni alternative per nascondere i file nascosti.

  • Sposta piuttosto che elimina: Invece di eliminare i file ricorsivamente, in primo luogo mi sono abituato a move i file che voglio eliminare da qualche altra parte prima di eliminarli definitivamente. Se qualcosa è andato storto è facile da ripristinare.

    mv -b SOURCE DEST
    
  • Utilizza find (possibilmente con grep ) per anteprima se desideri eliminare in modo ricorsivo i file selezionati. Dovresti provare a renderlo un evento raro, ma se devi ...

    1. find senza argomenti elenca in modo ricorsivo tutti i file / directory sotto quello corrente. Dovresti provare a cercare man find su come renderlo selettivo (un tesoro), ma se non vuoi disturbarti, puoi semplicemente usare il familiare grep per filtrare i file che vuoi eliminare.
    2. Supponiamo di essere un hacker del kernel uber-l33t e sono infastidito dai pochi KB di file di "esempio" nella mia struttura di sorgenti; Voglio cancellare tutti i file che contengono quello nel nome. Quindi scrivo find | grep example , che mi dà questi 20 file. Sembra buono, quindi ora vado a eliminare quei file esatti , insieme all'output verbose rm -v precedentemente menzionato, tramite xargs :
      find | grep example | xargs rm -v
      che mi dà questo output. Tale anteprima impedisce problemi in cui, diciamo, fai un refuso e digita sample invece di example .

La soluzione di cui sopra non dovrebbe essere utilizzata se potresti avere nomi di file contenenti spazi, caratteri di tabulazione, nuove righe o virgolette ( " o ' ), poiché questo porterà xargs a fallire o feed rm con nomi di file incompleti, che nel peggiore dei casi potrebbero finire per rimuovere i file errati. Il modo sicuro per fare quanto sopra è fare tutto con gli operatori e le azioni di find .

Quanto segue mostra tutti i file che contengono la parola example

find . -name "*example*"  

Se l'elenco è i file che desideri rimuovere, utilizza l'azione -exec per passare i file a rm .

find . -name "*example*" -exec rm -v {} +

Vedi Utilizzo Trova per ulteriore assistenza sull'uso di find .

    
risposta data Lekensteyn 13.04.2017 - 14:14
5

Sì. Un personaggio tilde non quotato come argomento separato viene esteso al tuo homedir. Quindi rm -r ~ è stato espanso a rm -r /home/yourusename . Quindi hai detto a rm di cancellare in modo ricorsivo tutti i file nel tuo homedir.

Vedi link per ulteriori informazioni su come funziona l'espansione delle tilde.

    
risposta data geirha 29.06.2012 - 10:57

Leggi altre domande sui tag