Welchen Befehl muss ich verwenden, um eine Datei mit dem Namen "-rf" zu entfernen?

67

Irgendwann habe ich etwas Verrücktes gemacht, das eine Datei -rfauf meinem Dateisystem erstellt hat.
Jetzt kann ich nicht herausfinden, wie man es löscht ...

Ich habe es versucht:

rm "-rf"
rm \-rf

Diese gehen einfach sofort raus , arrgh!

Weiß jemand, wie man diese Datei entfernt? Am liebsten ohne versehentlich meinen ganzen Ordner auszuräumen.

Pierre-Antoine LaFayette
quelle
33
Einige Nerven versuchen, rmeine Datei -rfaus Ihrem System aufzurufen, ohne sich an die genaue Syntax zu erinnern!
ChristopheD
3
Um zu erklären, warum diese nicht funktionieren: Anführungszeichen und Escapezeichen werden von Ihrer Shell analysiert (normalerweise bash), und dann wird das Ergebnis der Analyse an rm(in it's argcand argv) übergeben. Beide führen dazu, dass das Array ["rm", "-rf"]an übergeben rmwird. was macht was man erwarten würde.
Thanatos
3
Ich denke, dies ist näher an einem Duplikat von Unix und Linux StackExchange: unix.stackexchange.com/questions/1519/…
Frabjous
12
Ein alter Gag ist es, eine Datei mit dem Namen *in einen Ordner zu bekommen. Geben Sie auch einen Namen -rfan und sehen Sie sich den Spaß an ;-)
RBerteig
@ RBerteig: mkdir './-rf '(ls --classify, ein üblicher Standardwert in einem Shell-Alias, fügt ein / hinzu.)

Antworten:

127
unlink -rf

Oder

rm -- -rf
Josh Lee
quelle
47
Dies ist die nützlichste Lösung, um IMO zu lernen, da "-" zum Unterbrechen der Verarbeitung von Argumenten in allen GNU-Tools standardisiert ist
Nathan O'Sullivan
1
Um genauer zu sein, etwas mit GNUgetopt hat --, die die meisten modernen Linux - Tools bedeuten sollte.
Geoffrey Zheng
60

Andere Option:

rm ./-rf

... unter der Annahme, dass sich in Ihrem aktuellen Verzeichnis die Datei befindet.

Martin Clayton
quelle
34

Alternativ können Sie das Verzeichnis, in dem es sich befindet, jederzeit bearbeiten und die Datei auf diese Weise entfernen.

vim .

und dann löschen Sie einfach die Zeile mit der Datei darauf (mit D, dd wird nicht funktionieren).

oadams
quelle
5
Guter Trick! [Mehrere nutzlose Zeichen]
Sergio Acosta
Ich dachte nicht, dass dies die Abstimmungen, die es hatte, als ich diese Antwort heute Nachmittag zum ersten Mal sah, verdiente, aber ich hatte keine Chance zu überprüfen, ob es vimsich um einen Dired-Modus handelte. Es ist klar, dass das Bearbeiten des eigentlichen Verzeichnisses in einem Texteditor weder empfohlen noch möglich ist, ohne dass ein echtes Experten-Hoop-Jumping erforderlich ist. Beachten Sie, dass emacsdies auch aus demselben Grund funktionieren würde.
RBerteig
1
Extrapunkte für den cleveren Vim-Einsatz! :)
Pierre-Antoine LaFayette
Gut
25

Eine generische Technik zum Löschen seltsamer Dateinamen ist die Verwendung.

 ls -li

um die Inode-Nummer der Datei zu finden und dann zu verwenden.

find ./ -inum <number of file> -delete

Sie müssen sich nicht an alle Sonderfälle erinnern.

user51427
quelle
4
Ich wusste nicht, dass ich findDateien löschen kann.
Zneak
Dies eignet sich auch hervorragend zum Abfangen von Dateien mit unbekannten Namen (beginnend mit oder einschließlich Backspace-Zeichen oder mit einem zusätzlichen Leerzeichen am Ende), vorausgesetzt, Sie haben Zugriff auf einen anständigen GNU-Fund auf Ihrer Box.
Olfan
17

Obwohl ich den "rm - -filename" - Trick kenne, starte ich einen GUI-Dateimanager und tue dies von dort aus, um die Chance auszuschließen, wenn ich irgendwie eine Datei mit einem führenden Namen bekomme, den ich entfernen möchte von Fehlern.

Heptit
quelle
1
Er hat möglicherweise überhaupt keine GUI, daher funktioniert dies möglicherweise nicht.
Wuffers
12
Wenn es dumm und falsch war, verdient es vielleicht eine Ablehnung, aber ich glaube nicht daran, diese Antwort abzulehnen, nur weil es "vielleicht nicht funktioniert". Dieser Vorschlag kann keinen Schaden anrichten.
JT.WK
4
Es gibt immer Mitternachtskommandanten (oder andere Dateimanager, die auf Flüchen basieren) für diejenigen ohne X.
ThomasRutter
9

Wenn Sie nur sicher sein wollen:

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf
Jan
quelle
4

Nur für den Fall, dass Sie sich auf einem Nicht-GNU-Unix befinden und sich in die Steinzeit zurückversetzt fühlen (keine --Syntax, kein -inumSchalter zum Finden, kein Befehl zum Aufheben der Verknüpfung , Ihr Editor lehnt das Bearbeiten von Verzeichnissen usw. usw. ab), können Sie sich trotzdem selbst helfen:

find . -name '-rf' -print | xargs rm -i

Dies führt dazu, dass find alle potenziellen Kandidaten an rm weiterleitet, die wiederum für jede einzelne Datei, die es weiterleitet, um Erlaubnis / Verweigerung bitten.

Falls Sie rmden -iSwitch nicht einmal unterstützen (HP-UX 10.2 unter PA-RISC 1.1?), Gehen Sie vorsichtiger vor:

find . -name '-rf' -print
# check that find's output is exactly and only what you need to delete
find . -name '-rf' -print | xargs rm
Olfan
quelle
Was ist, wenn Ihr System nicht einmal hat find?
Lie Ryan
Das wäre wirklich böse. Leider muss ich noch eine Unix-Installation ohne eine treffen. Können Sie mir einen Hinweis geben?
Olfan
Wenn ich darüber nachdenke, wäre meine Antwort angemessener gewesen, wenn die Frage bei Serverfehler gestellt worden wäre. Es ist nicht sehr wahrscheinlich, dass Superuser Maschinen haben, die so alt sind wie die, auf die ich mich beziehe. Und diejenigen, die das tun, werden gelernt haben, sich selbst zu helfen. ;-)
Olfan
+1, @Olfan, zu deiner Verteidigung, jemand, der gerade irgendwo in einem Schrank auf ein Unix-Legacy stößt, braucht noch eine Ressource, um Tipps und Tricks zu lernen von ...
RBerteig
3

Unterstützung von jleedev Antwort , würde ich verbessern mit:

rm -i -- -rf

Um im interaktiven Modus zu sein und um Bestätigung zu bitten, können Sie wirklich sicher sein, was Sie löschen. (obwohl die Lösung in Ordnung ist. Es ist einfach für Ihre Seelenruhe)

Verwenden Sie sogar Folgendes:

\rm -i -- -rf

um sicherzustellen, dass Sie keine Aliase verwenden.

Haylem
quelle
2

Wie bereits vorgeschlagen, habe ich immer die Syntax verwendet

rm -rf -- filename

Als ich eine Datei mit einem Bindestrich als Präfix entfernen musste, weil das - dem Befehl sagt, dass es nicht nach anderen Parametern sucht, sondern nur nach Dateinamen.

Um meinen wichtigen Ordner durch versehentliches Löschen von Dateien zu schützen, habe ich eine leere Datei mit dem Namen "simply -i" erstellt, die normalerweise beim Auflösen der * -Suche ganz oben in der Dateiliste steht. Also der Befehl

rm -rf *

Wenn der Ausdruck in meinem geschützten Ordner während der Ausführung explodiert wird, geben Sie den folgenden Befehl ein:

rm -rf -i filename1 filename2 .... (all the other files in the folder)

Anstatt alles sofort zu löschen, fordert die Shell keine Bestätigung mehr an (wie bei der Option -i erforderlich).

Ghidello
quelle
+1 für den -iDateinamen Hack - "Ich" war skeptisch, aber es testet!
Rymo
2

Als ich das letzte Mal dieses Problem hatte, löste ich es mit:

Python

import os

os.remove ("- rf")

Jono
quelle
1

Martin Clayton hat recht.

Es ist sehr einfach und logisch. Wenn die Optionen existieren , ist es immer -XXXnoch --CCCCso , wenn Sie ein setzen ./oder der vollständige Pfad -rfnicht als Option in Betracht gezogen wird und werden als normaler String betrachtet werden.

Es funktioniert mit "allen" seltsamen Dateinamen.

#pwd
/ tmp / TEST
#touch ./-rf
#ls 
-rf
#rm ./-rf 
#ls
#
Louis
quelle
1

rm - -rf Die meisten Gnu-Tools akzeptieren - als Markierung für das Ende der Optionen

Konrads
quelle