Was hat 'rm -r ~' mit meinem Home-Verzeichnis gemacht?

17

gedit erstellt versteckte Sicherungsdateien, die mit '~' enden. Ich wollte eine rekursive Bereinigung meines Verzeichnisbaums durchführen.

Der Befehl rm *~löscht alle lokalen Dateien, die mit '~' enden.

Ich dachte, ich rm -r *~ .würde alle Dateien im gesamten Baum löschen, aber ich habe getippt rm -r ~.

Es gab eine Meldung, dass ein Verzeichnis nicht gelöscht werden konnte, und ich beendete den Befehl. Die Frage ist: Was habe ich gelöscht?

Ich habe bemerkt, dass meine Filezilla-Konfiguration weg war. Löscht dieser Befehl alle versteckten Verzeichnisse aus dem Ausgangsverzeichnis?

GUI Junkie
quelle
4
Nun, zumindest habe ich eine Backup-Strategie ... Kein wirklicher Schaden angerichtet.
GUI Junkie
2
Gut zu wissen; Ich habe die Politik, niemals zu verwenden, es -rsei denn, ich möchte alles loswerden.
ish
3
Als Randnotiz rm -r *~ .würden alle Dateien und Ordner (im aktuellen Verzeichnis) übereinstimmen *~oder löschen .. (wird ausnahmsweise .ignoriert rm, da die meisten *~Benutzer das aktuelle Verzeichnis nicht rekursiv löschen möchten. Dadurch werden alle Dateien und Verzeichnisse im aktuellen Verzeichnis gelöscht, die auf enden ~, jedoch nicht die Dateien und Verzeichnisse in den Unterverzeichnissen des aktuellen Verzeichnisses. ) Also das hättest du nicht gewollt. Sie hätten wahrscheinlich findmit dem -execFlag rekursiv durch den Verzeichnisbaum schauen und jede Datei, die auf endet, nicht rekursiv löschen wollen ~.
Eliah Kagan,
@EliahKagan, ich denke schon, aber mit -exec zu finden ist immer mühsam. Das Wiederherstellen des Heimverzeichnisses ist allerdings eher mühsam :-)
GUI Junkie
1
Zur Information: Wenn Sie den ~Charakter singen , ohne ihn zu verlassen (wie \~folgt:), wird Bash, ZSH usw. (der rmBefehl im Grunde genommen) glauben, Sie meinen das Home-Verzeichnis.
Thomas Ward

Antworten:

31

Sie haben (fast) Ihr gesamtes Home-Verzeichnis gelöscht!

rm -r something löscht rekursiv Dateien und Verzeichnisse in / unter etwas ; Es schlägt nur bei Elementen fehl, für die es keine Löschberechtigung hat, entweder weil sie einem anderen Benutzer gehören (z. B. root) oder weil sie verwendet werden (z. B. ein GVFS-Mount).

Wenn Sie -f(wie in, rm -rf something) nicht hinzufügen , erhalten Sie Folgendes:

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

An diesem Punkt können Sie den Vorgang abbrechen und stellen dann wahrscheinlich fest, dass Sie den falschen Befehl ausgeführt haben.

Vorschläge der Community, wie solche Unfälle vermieden werden können

Hinweis: Community-Wiki, jeder kann gerne mitmachen.

  • Verwenden Sie für einige Dateien die -iOption, um eine Bestätigung zum Entfernen von Dateien oder Verzeichnissen zu erhalten:

    $ 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
  • ./Stellen Sie beim Entfernen aus einem aktuellen Verzeichnis ein voran, um zu vermeiden, dass versehentlich ein anderer Speicherort entfernt wird:

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

    Das Obige diente zur Demonstration der Verwendung von ./. Wenn es ein Unterverzeichnis gibt, können Sie es natürlich auch verwenden rm -v something/*~. Achtung : Denken Sie nicht, dass dadurch rm ./.*alle versteckten Dateien im aktuellen Verzeichnis entfernt werden. In dieser Serverfault-Frage finden Sie Problemumgehungen für das Globbing versteckter Dateien.

  • Verschieben statt löschen: Anstatt Dateien an erster Stelle rekursiv zu löschen, habe ich mich daran gewöhnt , die Dateien, die ich entfernen möchte, an einen anderen Ort zu verschieben, bevor ich sie endgültig lösche. Wenn etwas schief gelaufen ist, ist es einfach wiederherzustellen.

    mv -b SOURCE DEST
  • Verwenden Sie find(möglicherweise mit grep), um eine Vorschau anzuzeigen, wenn Sie ausgewählte Dateien rekursiv löschen möchten. Sie sollten versuchen, dies zu einem seltenen Ereignis zu machen, aber wenn Sie ...

    1. findohne Argumente listet rekursiv alle Dateien / Verzeichnisse unter dem aktuellen auf. Sie sollten versuchen, eine man findAuswahl zu treffen (eine Fundgrube), aber wenn Sie sich nicht darum kümmern möchten, können Sie die vertrauten grepFilter verwenden, um nach den Dateien zu filtern, die Sie löschen möchten.
    2. Angenommen, ich bin ein überragender Kernel-Hacker, und die wenigen KB "Beispiel" -Dateien in meinem Quellenbaum stören mich. Ich möchte alle Dateien löschen, die das im Namen enthalten. Also tippe ich find | grep example, was mir diese 20 Dateien gibt. Das sieht gut aus, also gehe ich jetzt und lösche die genauen Dateien zusammen mit der rm -vzuvor erwähnten ausführlichen Ausgabe über xargs:
      finden | grep Beispiel | xargs rm -v
      das gibt mir diese Ausgabe. Eine solche Vorschau verhindert Probleme, bei denen Sie beispielsweise einen Tippfehler machen und samplestattdessen tippen example.

Die obige Lösung sollte nicht verwendet werden, wenn Sie möglicherweise Dateinamen haben, die Leerzeichen, Tabulatorzeichen, Zeilenumbrüche oder Anführungszeichen ( "oder ') enthalten, da dies xargsentweder zum Fehlschlagen oder zur Eingabe rmunvollständiger Dateinamen führt, was im schlimmsten Fall zum Entfernen des falschen führen kann Dateien. Der sichere Weg, dies zu tun, besteht darin, alles mit findden Operatoren und Aktionen von zu tun .

Im Folgenden werden alle Dateien angezeigt, die das Wort enthalten example

find . -name "*example*"  

Wenn es sich bei dieser Liste um die Dateien handelt, die Sie entfernen möchten -exec, übergeben Sie die Dateien mithilfe der Aktion an rm.

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

Weitere Hilfe zur Verwendung finden Sie unter Verwenden von Findfind .

Lekensteyn
quelle
1
Leitungsausgang findzu grepund xargs rmist gefährlich.
Geirha
2
@izx: hinzugefügt mv(mein Lieblingsbefehl);)
Takkat
1
Zumindest möchte ich ein Beispiel für finddie sichere Verwendung hinzufügen , das nicht kaputt geht (und möglicherweise die falschen Dateien löscht), wenn Dateinamen Leerzeichen, Tabulatoren, Zeilenumbrüche "oder 'Zeichen enthalten. Eg find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha
1
@geirha: warum ist das find -deleteso gefährlich? Ich hätte hier etwas gesagt, aber ich weiß nicht anders als es kürzlich gefunden und habe meine /trotz eines Probelaufs ohne Option -deletenur wenige Dateien gefunden, die ich entfernen wollte. Ich sehe, dass Sie -exec rmstattdessen empfehlen .
Takkat
3
@Takkat -deleteist nicht gefährlich, und Sie können es sicher anstelle von verwenden -exec rm {} +. Im Allgemeinen bevorzuge ich die Verwendung von Standardtools und -funktionen, wenn dies möglich ist. -deleteist eine nicht-standardmäßige GNU-Erweiterung find, die unter Ubuntu funktioniert, auf anderen Systemen jedoch möglicherweise nicht.
Geirha
5

Ja. Ein nicht zitiertes Tilde-Zeichen als separates Argument wird zu Ihrem Homedir erweitert. Also rm -r ~wurde erweitert um rm -r /home/yourusename. Also haben Sie rm angewiesen, alle Dateien in Ihrem Homedir rekursiv zu löschen.

Weitere Informationen zur Funktionsweise der Tilde-Erweiterung finden Sie unter http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion .

geirha
quelle