Absicht:
rm -rf string*
Problem:
rm -rf string *
Der erste Fall ist eine legitime und gebräuchliche Verwendung von rm, ein kleiner Tippfehler kann im zweiten Fall viele Probleme verursachen. Gibt es eine einfache Möglichkeit zum intelligenten Schutz vor versehentlich nachgestellten oder führenden Platzhaltern?
zsh
oderbash
) würde ich lieber die Tabulatortaste drücken (um die automatische Vervollständigung auszulösen), bevortouch -- -i
erstellt eine Datei-i
, dierm
als Parameter übergeben wird,-i
wenn Sie ein Platzhalterzeichen in Ihre Argumente einfügen.rm *
. Wenn Sie tippenrm name *
, wird es zu erweiternrm name -i other names
.-i
wird nicht als Option verarbeitet, da es nicht vor den Dateinamen ist.Antworten:
Es
DEBUG
könnte ein Trap geschrieben werden, um Befehle abzubrechen, die verdächtig aussehen. Folgendes oder ein ähnlicher Code kann zu Ihrem hinzugefügt werden~/.bashrc
:Passen Sie die Logik nach Geschmack an.
(Eigentlich erwarte ich nicht, dass dieser Ansatz nützlich ist - zu viele Möglichkeiten, einen Befehl zerstörerisch durcheinander zu bringen, um sie einzeln testen zu können -, aber er bietet eine wörtliche Antwort auf die Frage.)
quelle
Es gibt keine Möglichkeit, ein System vollständig kugelsicher zu machen. Und das Hinzufügen von "Sind Sie sicher?" Aufforderungen zu Dingen sind sowohl kontraproduktiv als auch führen zu "Natürlich bin ich mir sicher." Knie-zuck-Reaktionen.
Ein Trick, den ich in den vergangenen Jahren in einem Buch aufgegriffen habe, ist, erst
ls -R blah*
dann zu tun,rm -fr blah*
wenn die Auflistung, die auftaucht, genau das trifft, was ich wollte.Es ist einfach genug, den
ls
Befehl zuerst ↑auszuführen , dann zu löschenls -R
und durch zu ersetzenrm -fr
.Die letzte Frage lautet: "Wenn die Informationen für Sie wertvoll waren, wo ist Ihr Backup?"
quelle
^ls -R^rm -rf^
ls -R
es, was ich im Grunde die ganze Zeit mache, aber es ist zu diesem Zeitpunkt so instinktiv, dass es mir aus dem Kopf ging, als ich mich durch die Antwort formte. Also +1 dafür.cat > .log
gebe Dinge manchmal in einer weniger effizienten Reihenfolge ein, um die Sicherheit zu erhöhen, z. B. gehe ich dann zurück und füge den Dateinamen vor dem ein.log
. Also habe ich zu keinem Zeitpunkt> valuablefile
auf der cmdline.rm -i
, so dass ich oft nur meinen rm-Befehl verfasse und dann ein\
an den Anfang der Zeile setze . (\rm
vermeidet Alias-Erweiterung für rm, da ein Teil des Wortes zitiert wurde). Wenn ich ein-r
oder brauchte-f
, fange ich manchmal damitls
anrm
, oder lass das-rf
Teil einfach weg . (edit, wie bekommt man einen Backslash-Code-Formatierung? Bquote Bslash Bslash Bquote schlägt fehl.Können Sie sich an die
rmrf
Stelle von beispielsweise trainierenrm -rf
?In diesem Fall können Sie mit dieser Bash-Funktion sehen, was tatsächlich passieren würde, bevor Sie den Befehl bestätigen:
Um diese Funktion dauerhaft zu aktivieren, fügen Sie diese Zeile der
~/.bashrc
Datei auf jedem von Ihnen verwendeten Computer hinzu.Vergleich mit dem allgemeinen
rm
AliasEs ist üblich, einen Alias zu definieren:
Dies hat zwei Einschränkungen:
Wenn Sie sich auf diesen Alias verlassen, werden Sie einen Schock erleben, wenn Sie sich auf einem Computer befinden oder in einer Umgebung, in der er nicht vorhanden ist. Wenn Sie dagegen versuchen,
rmrf
auf einem Computer ohne diese Funktion zu laufen , wird ein harmloser Wert zurückgegebencommand not found
.Dieser Alias ist in Ihrem Fall keine Hilfe, da die
-f
Option, die Sie in der Befehlszeile angeben, die-i
Option im Alias überschreibt .quelle
rm -rf
Befehl aus. Was passiert dann? Das Erstellen von Pseudofunktionen wie diesen erschwert letztendlich nur eine einfache Lösung: Seien Sie nur vorsichtiger und verstehen Sie, was Berechtigungen sind.rmrf
, anstatt nur eine Shell-Funktion zu erstellenrm
, die nach den Argumenten sucht-r
oder-rf
in diesem Fall eine spezielle Logik ausführt, und ansonsten direkt aufruftcommand rm "$@"
, um den echtenrm
Befehl aufzurufen ?-f
wenn du nicht hast-i
. Wenn-f
Sie diese Option deaktivieren, erhalten Sie eine zusätzliche Warnung, bevor Sie beispielsweise eine schreibgeschützte Datei entfernen.Wenn ich in einer Situation bin , wo die falschen Dateien löschen eine wirklich große Sache ist, eines der Dinge , die ich getan habe , ist ein Papierkorb - Ordner zu machen, wie
mkdir trashcan
, und dann habe ich ein Skript ,rmTrashcan
das eine hatrm -rf trashcan/*
oderrm -rf *
oder ähnliches, geschrieben sehr sorgfältig und mehrmals überprüft.Auf diese Weise liegt der Fehler bei einem
mv
Befehl und nicht bei einemrm
Befehl , wenn ich einen Fehler mache . Sobald ich a machels
und mir sicher bin , was genau ich lösche,rmTrashcan
erledigt a die Drecksarbeit tatsächlich sicher.Es war auch sehr praktisch für eine Situation, in der ich Backups löschen musste. Ich konnte
mv
einen ganzen Monat Backups in den Mülleimer,mv
die wenigen , die ich behalten wollte (1. des Monats, 15. des Monats), wieder in die Backups, dannrmTranshcan
den Rest. Es ist schwierig, einen ähnlichen Befehlrm
alleine auszuführen, und auf diese Weise könnenls
die Backups sicher sein, welche Dateien ich zurücklasse (anstatt nur die Dateien aufzulisten, die ich löschen möchte).quelle
Anstatt sich mit zwei Befehlen (
ls
undrm
) zu beschäftigen, ist die Verwendung meines Erachtens einfacher und einfacherfind
:Wenn Sie versehentlich tippen
"string *"
, werden die Dateien mit dem Namenstring chars
und gelöschtstring letters
(was Sie sowieso wollten), es werden jedoch nicht alle Dateien wie*
in einer Shell abgerufen.Sie können auch
-delete
das Feld weglassen, um zu sehen, welche Dateien gelöscht werden sollen, dann den Pfeil nach oben drücken und-delete
einfacher tippen als tippen^ls -R^rm -rf
oder anderen Unsinn.quelle
find
führt eine verschachtelte Suche nach Dateien durch, die den in der Befehlszeile deklarierten expliziten Parametern entsprechen. Ich denke, das verfehlt die Marke. Ich könnte mich jedoch irren.Nicht wirklich. In einer anderen Antwort wird vorgeschlagen, vor dem Ausführen einer Aufgabe einen benutzerdefinierten Befehl zum Hinzufügen einer Eingabeaufforderung zu erstellen. Das Problem bei diesem benutzerdefinierten Befehl ist jedoch, dass er bewusst auf den Systemen installiert werden muss, an denen Sie arbeiten. Und selbst wenn es installiert ist, ist das Problem, dass Ihr Reflex, den Sie treffen müssen
y
, um die Aufgabe zu erledigen, ins Spiel kommen könnte.Das bedeutet, dass dies alles ein Problem der Benutzeroberfläche ist, auch wenn es sich um eine Text- / Befehlszeilenebene handelt. Wie viele Sicherheitsnetze erwarten Sie, um Sie davor zu schützen, etwas zu tun, das Sie nicht tun sollten? Es ist wie mit einer Schere: Wer ist schuld, wenn Sie nachlässig sind und Ihre Hand abrutschen und schneiden, während Sie beabsichtigen, Stoff oder Papier zu schneiden? Oder sogar Ampeln und Stoppschilder: Es gibt wirklich nichts, was einen Fahrer davon abhält, eine Ampel zu fahren oder Verkehrszeichen zu ignorieren, außer ein scharfes Bewusstsein dafür, was passieren könnte, wenn er sich auf ein derart riskantes Verhalten einlässt.
Die beste und realistischste Lösung sind jedoch die Systemberechtigungen für Benutzer und Gruppen. Das ist das beste / einzige echte Sicherheitsnetz, um einen Benutzer vor sich selbst zu schützen.
Wenn Sie an einem System arbeiten, auf das nur Sie zugreifen, könnte es sein, dass Sie zu allem versucht sind
chmod 777
, aber so wird ein rationales System nicht eingerichtet. Stattdessen sollten die Berechtigungen755
für alle Verzeichnisse und644
für alle nicht ausführbaren Dateien gleich sein. Ausführbare Dateien sollten755
mindestens vorhanden sein, aber möglicherweise auch dann,744
wenn Sie nur möchten, dass andere die Dateien lesen, aber nicht ausführen.quelle
Versuchen Sie, Ihren anfänglichen
rm
Befehl ohne das-f
Flag, aber mit-i
so zu verfassen , dassrm
Sie für jede zu löschende Datei aufgefordert werden. Bei kleinen rekursiven Löschvorgängen können Sie die yTaste gedrückt halten, sobald Sie sicher sind, dass der Befehl richtig eingegeben wurde. Für große Deletionen, können Sie den Vorgang abbrechen, und die Geschichte Verwendung Command sorgfältig die ändern-i
zu ein-f
.quelle
y[RETURN]
jede Datei drücken , es gibt nichts, was Sie mit GNU rm festhalten können. Wenn-i
Sie den Befehl richtig eingegeben haben, müssen Sie nur noch das bearbeiten . Dann erhalten Sie eine Eingabeaufforderung nur für eine schreibgeschützte Datei und möglicherweise für andere Dinge.rm -I
Sie einfach, damit es nur einmal und nur für potenziell gefährliche Löschvorgänge (dh von vielen Dateien) auffordert.rm muss
-i
und-I
flags vor jedem entfernen bestätigen. In der Vergangenheit haben einige Distributionen diese standardmäßig aktiviert. Das ist eine schreckliche Idee. Geben Sie dem Benutzer zu viele Bestätigungsdialogfelder für den normalen Betrieb, und er beginnt, diese gewöhnlich zu bestätigen. Dies verlagert die Forderung nach "Vorsicht" (immer eine rote Fahne) auf einen neuen und nervigeren Dialog. "Ja. Ja. Ja. Ja! JA! Verdammt, dummer Computer, lösche einfach die Dateien. Dies ist das "Ja, aber ich meinte nein" -Dialogproblem. Diese Antwort bietet eine visuelle Erklärung, warum Bestätigungsdialogfelder zum falschen Zeitpunkt angezeigt werden.Die Art von Fehler, die Sie beschreiben, ist ein Ausrutscher , "die Ausführung einer Handlung, die nicht das war, was beabsichtigt war". Der Benutzer erkennt den Fehler normalerweise sofort und weiß genau, wie er behoben werden kann. Leider gibt Unix dem Benutzer nicht die Möglichkeit, rm löscht die Datei sofort. Jedes andere Betriebssystem löst dieses Problem, indem es zulässt, dass Löschvorgänge mithilfe des Papierkorbs zumindest für kurze Zeit rückgängig gemacht werden.
Es gibt verschiedene Müllsysteme für Unix, und diese Antwort steckt voller Vorschläge .
Die Frage ist nach Alias rm oder nicht nach Alias rm. Vorteile des Aliasing von rm ...
Nachteile für das Aliasing von rm ...
Wenn Sie dem ersten Argument zu weit folgen, verwenden Sie vi (nicht vim, vi), csh (nicht tcsh, csh) und andere veraltete Dienstprogramme, da diese allgemein verfügbar sind. Dennoch besteht die Gefahr einer Überanpassung Ihrer Umgebung. Ich nehme meine Dienstprogramme lieber mit und mache es mir so einfach wie möglich. YMMV.
Zwei und drei sind technische Probleme. Sie können mit einem cleveren Schnitter-Job gelöst werden, der die Größe des Mülls überprüft und die Dinge regelmäßig aufräumt, ähnlich wie bei einem billigen . Dies kann ein Cron-Job sein, oder eine cleverere Version kann die verschiedenen Dateisystem-Ereignisinfrastrukturen nutzen, die auf vielen Desktop-Linux-Distributionen verfügbar sind. Dies ist nicht einfach und noch schwieriger effizient zu erledigen. Es ist besser, ein vorhandenes System zu finden, als zu versuchen, ein eigenes zu erstellen.
Das vierte Problem kann behoben werden, indem Sie Ihren neuen rm zu einem Shell-Alias machen
alias rm='trash'
. Dann hat dies keine Auswirkungen auf Programme.Das fünfte Problem überlasse ich dem Leser. RM hat nicht viele Schalter.
quelle
rm -i
, aber ich benutze\rm
es oft , um ein voreingenommenes Verhalten zu bekommen. Ichrm -i
tippe jedes Mal, wenn ich NEIN zu einem der Argumente sagen will. Ich starte den Befehl manchmalls
als Befehl und gebe dann erst dann den \ rm ein, wenn ich fertig bin. Also gibt es keinen Weg , ich versehentlich Rückkehr treffen kann aufrm -rf /
statt/.../file
rm -I
oderrm --interactive=once
ist weit, weit weniger ärgerlich alsrm -i
und fängt immer noch etwas Gefährliches (es wird nur angezeigt, wenn es mehr als 3 Dateien gibt oder wenn es rekursiv ist und nur EINMAL anstelle von FÜR JEDE DATEI.)-i
kann dem Benutzer Zeit geben, Ziele zu ändern. Diese Antwort auf eine verwandte Frage zeigt alles auf.rm -i
länger als 30 Sekunden damit leben, ohne es auszuschalten. Währendrm -I
nur fordert, wenn es wahrscheinlich ist, dass Sie vermasselt haben; Die Aufforderung kommt nur für große Löschungen. Wenn Sie versucht haben, ein paar Dinge zu löschen, und die Aufforderung angezeigt wird, sind Sie überrascht und stellen fest, dass Sie versehentlich "foo *" eingegeben haben.-rf
soeben entdeckten Gewohnheit deaktiviert ) sind schlechte Proxys, um einen wahrscheinlichen Fehler zu erkennen. Das Löschen eines Unterverzeichnisses ist wahrscheinlich kein Problem. Die Meldung hilft nicht weiter, da sie nur bestätigt, was der Benutzer gesagt hat, ohne nützliche Informationen an einem Punkt hinzuzufügen, an dem der Benutzer nicht nachprüfen möchte. "rm: 1 Argument rekursiv entfernen?" "Ja, lösche das Verzeichnis, ich habe dir gerade gesagt, dass du das machen sollst! ... warte, welches Verzeichnis war das? CRAP !!!"Ich bringe jedem das
!$
letzte Argument im letzten Befehlstrick bei:Dies ermöglicht eine Überprüfung der Platzhaltererweiterung und anschließend die Verwendung des exakt gleichen Glob-Musters, ohne die Möglichkeit, ein Leerzeichen vor dem einzufügen
*
.Außerdem schlage ich vor, dass Benutzer niemals ein Platzhaltermuster ausschneiden und in eine möglicherweise destruktive Befehlszeile einfügen. Denn in meinen eigenen Händen war das ein Problem :)
Ein Techniker in meinem Labor hat diesen Fehler letzte Woche gemacht (3 Monate Arbeit) - und ja, wir hatten ein Backup (1 Tag im Rückstand).
quelle
Jeder scheint zu sagen: "Seien Sie vorsichtiger", "Machen Sie keine Alias- / Bestätigungsaufforderung, weil Sie sich daran gewöhnen, dass Sie sich nicht richtig darum kümmern".
Cool und alles. Ich meine, ich denke nicht, dass Sie einen Alias für machen sollten
rm
(nochrmrf
, da Sie das leicht vermasseln und den echten Befehl eingeben könnten).Aber warum können Sie nicht einen Alias / ein Skript erstellen und ihn / es sagen
remove
und nur ein Argument (z. B. $ 1) eingeben? Der Platzhalter sollte $ 2 sein, da es sich um ein versehentliches Leerzeichen handelt (amiright?) Und daher wird Ihrem Skript / Wrapper / Alias nicht der zweite Platz zugewiesen. Ja, Sie können jeweils nur einen Satz von Löschvorgängen (mit Platzhalterzeichen) ausführen, aber das ist der Preis, den Sie bezahlen würden.Wenn ich etwas Nettes schreibe, kann ich mir die Anzahl der zu löschenden Dateien und Verzeichnisse sowie die Gesamtgröße der gelöschten Dateien anzeigen lassen und danach eine Bestätigung anfordern, aber dies kann Ihren Datenfluss beeinträchtigen. Vielleicht machen Sie das zu einer Flaggenoption
remove
? (-ich). Möglicherweise möchten Sie auch $ 1 überprüfen, um festzustellen, ob es sich nur um einen einzelnen Platzhalter handelt, und um eine Bestätigung bitten sowie angeben, in welchem Verzeichnis Sie sich tatsächlich befinden.Abgesehen davon gibt es eine Reihe von
rm
Ersetzungen da draußen. Viele versuchen, mit dem Desktop-Papierkorb der Benutzeroberfläche kompatibel zu sein. Einige davon könnten einen Blick wert sein.quelle
remove \*
? Wenn Ihr Skript die Eingabe der Shell-Glob-Erweiterung zulässt, kann ich nicht viel damit anfangen.Ein sehr einfacher Trick ist es,
-rf
am Ende zu setzen :rm whatever* -rf
Dadurch wird die Fehlerrate drastisch reduziert, da Sie mehr Zeichen nach dem
*
eingeben, damit Sie mehr Zeit haben, Tippfehler zu sehen.Das löst nicht alles. Nur ein einfacher alltäglicher Trick.
quelle