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


17

gedit crea file di backup nascosti che terminano con '~'. Volevo fare una pulizia ricorsiva della mia struttura di directory.

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

Ho pensato di rm -r *~ .eliminare tutti i file nell'intero albero, ma ho sbagliato a scrivere rm -r ~.

C'è stato un messaggio che non è stato possibile eliminare alcune directory e ho chiuso il comando. La domanda è: cosa ho cancellato?

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


4
Beh, almeno ho una strategia di backup ... Nessun danno reale fatto.
GUI Junkie,

2
Buono a sapersi; Ho una politica di non usare mai a -rmeno che non voglia liberarmi di tutto.
ish,

3
Come nota a margine, rm -r *~ .eliminerebbe tutti i file e le cartelle (nella directory corrente) corrispondenti *~o .. ( .verrebbe ignorato rmcome un'eccezione speciale, poiché la maggior parte delle persone non vuole eliminare ricorsivamente la directory corrente. *~Elimina tutti i file e le directory nella directory corrente che termina ~, ma non i file e le directory nelle sottodirectory della directory corrente. ) Quindi non è quello che avresti voluto. Probabilmente avresti voluto usarlo findcon il -execflag per guardare in modo ricorsivo attraverso l'albero delle directory ed eliminare in modo non ricorsivo ogni file che termina ~.
Eliah Kagan,

@EliahKagan, credo di si, ma trovare con -exec è sempre una seccatura. Ripristinare la home directory è più una seccatura, però :-)
GUI Junkie

1
Informativo: cantare il ~personaggio senza sfuggirlo (in questo \~modo:) farà pensare a Bash, ZSH, ecc. (In rmpratica il comando) che intendi la directory home.
Thomas Ward

Risposte:


31

Hai eliminato (quasi) tutta la tua home directory!

rm -r something elimina in modo ricorsivo file e directory in / sotto qualcosa ; fallirà solo su elementi che non ha il permesso di cancellare, sia perché sono di proprietà di un altro utente (es. root), sia perché sono in uso (es. un mount GVFS).

Se non aggiungessi -f(come in, rm -rf something), otterrai qualcosa del tipo:

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

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

Suggerimenti della comunità su come evitare tali incidenti

Nota: wiki della comunità, tutti non esitate a contribuire.

  • Per alcuni file, utilizzare l' -iopzione 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 si rimuove da una directory corrente, aggiungere un prefisso a ./per evitare di rimuovere erroneamente una posizione diversa .:

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

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

  • Sposta anziché eliminare: piuttosto che eliminare i file in modo ricorsivo, in primo luogo mi sono abituato a spostare i file che voglio eliminare da qualche altra parte prima di eliminarli definitivamente. Se qualcosa è andato storto è facile da ripristinare.

    mv -b SOURCE DEST
  • Utilizzare find(possibilmente con grep) per visualizzare l' anteprima se si desidera eliminare in modo ricorsivo i file selezionati. Dovresti provare a rendere questo un evento raro, ma se devi ...

    1. findsenza argomenti elenca in modo ricorsivo tutti i file / directory in quello corrente. Dovresti provare a cercareman find come renderlo selettivo (un tesoro), ma se non vuoi preoccuparti, puoi semplicemente usare il familiare grepper filtrare i file che vuoi eliminare.
    2. Supponiamo che io sia un hacker del kernel uber-l33t e che sia infastidito dai pochi KB di file "di esempio" nel mio albero dei sorgenti; Voglio eliminare tutti i file contenenti quello nel nome. Quindi scrivo find | grep example, il che mi dà questi 20 file. Sembra buono, quindi ora vado a eliminare quei file esatti, insieme rm -vall'output dettagliato precedentemente menzionato, tramite xargs:
      trova | esempio grep | xargs rm -v
      che mi dà questo risultato. Tali problemi impedisce Ascolto in anteprima in cui dicono, si commette un errore di battitura e digitare sampleal posto di example.

La soluzione di cui sopra non deve essere utilizzata se si possono avere nomi di file contenenti spazi, caratteri di tabulazione, nuove righe o virgolette ( "o '), poiché ciò comporterebbe xargsun errore o un'alimentazione rmcon nomi di file incompleti, che nel caso peggiore potrebbero finire per rimuovere l'errore File. Il modo sicuro per fare quanto sopra è fare tutto confind gli operatori e le azioni.

Di seguito verranno mostrati tutti i file che contengono la parola example

find . -name "*example*"  

Se l'elenco contiene i file che si desidera rimuovere, utilizzare l' -execazione per passare i file rm.

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

Vedere Utilizzo di Trova per ulteriori informazioni sull'utilizzo find.


1
l' finduscita delle tubazioni verso greped xargs rmè pericolosa.
geirha,

2
@izx: aggiunto mv(il mio comando preferito);)
Takkat,

1
Aggiungerei almeno un esempio dell'uso findsicuro, uno che non si rompe (e potenzialmente elimina i file sbagliati) se i nomi dei file contengono spazio, tabulazione, nuova riga "o 'caratteri. Es find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha,

1
@geirha: perché è find -deletecosì pericoloso? Avrei detto qualcosa qui, ma non so altro che recentemente trovato e cancellato il mio /nonostante una corsa a secco senza opzione abbia -deletetrovato solo pochi file che volevo rimuovere. Vedo che mi consiglia -exec rminvece.
Takkat,

3
@Takkat -deletenon è pericoloso e puoi tranquillamente usarlo al posto di -exec rm {} +. In genere preferisco utilizzare strumenti e funzionalità standard quando possibile. -deleteè un'estensione GNU non standard a find, quindi funzionerà bene su Ubuntu, ma potrebbe non funzionare su altri sistemi.
geirha,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.