Wie entferne ich Dateien, die mit einem doppelten Bindestrich beginnen?

70

Ich habe einige Dateien auf meinem Unix-Computer, die mit beginnen

 --

z.B --testings.html

Wenn ich versuche, es zu entfernen, erhalte ich die folgende Fehlermeldung:

cb0$ rm --testings.html
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
       unlink file

Ich habe es versucht

rm "--testings.html" || rm '--testings.html' 

aber nichts funktioniert.

Wie kann ich solche Dateien auf dem Terminal entfernen?

cb0
quelle
Gleiches gilt für Serverfehler und Unix .
Dorian
1
@ Dorian Na gut, aber ich war zuerst :)
cb0

Antworten:

145
rm -- --testings.html

Die --Option weist rm an, alle weiteren Argumente als Dateinamen und nicht als Optionen zu behandeln, selbst wenn sie mit beginnen -.

Dies gilt nicht speziell für den Befehl rm. Die Funktion getopt implementiert es, und viele (alle?) Befehle im UNIX-Stil behandeln es genauso: --Beendet die Optionsverarbeitung und alles, was danach ein reguläres Argument ist.

http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt

Steve Jessop
quelle
4
Dies ist nicht bei allen Unix-Versionen Standard, funktioniert jedoch bei den meisten. In der Antwort von vatine finden Sie eine Alternative, die mit allen Versionen funktioniert.
Stephen Darlington
56
rm -- --somefile

Während das funktioniert, ist es eine Lösung, die auf der rmVerwendung von getopts zum Parsen seiner Optionen beruht . Es gibt Anwendungen, die ihre eigene Analyse durchführen und auch darauf kotzen (weil sie möglicherweise nicht unbedingt die "-- Logik Mittel-Ende der Optionen" ).

Aus diesem Grund sollten Sie folgende Lösung durch Ihren Schädel fahren:

rm ./--somefile

Es wird immer funktionieren, denn auf diese Weise beginnen Ihre Argumente nie mit einem -.

Darüber hinaus, wenn Sie versuchen, wirklich anständige Shell-Skripte zu erstellen; Sie sollten sich technisch ./vor alle Erweiterungen Ihrer Dateinamenparameter stellen, um zu verhindern, dass Ihre Skripte aufgrund funky Dateinameneingaben beschädigt werden (oder um zu verhindern, dass sie missbraucht / ausgenutzt werden, um Dinge zu tun, die sie nicht tun sollen: Zum Beispiel rmwerden Dateien gelöscht Aber überspringen Sie Verzeichnisse, während rm -rf *alles gelöscht wird. Wenn Sie einen Dateinamen von " -rf" an ein Skript oder an jemanden übergeben touch ~victim/-rf, kann dies dazu verwendet werden, sein Verhalten mit wirklich schlimmen Konsequenzen zu ändern.

lhunath
quelle
2
+1, weil Sie Recht haben, aber das Erstellen von Skripten kugelsicher ist ein ganz anderes Problem als der Umgang mit einem unangenehmen Dateinamen. Wenn die Frage lautete: "Wie entferne ich Dateien, die mit Bindestrichen beginnen oder Leerzeichen enthalten;, <>, $ und anderen bösartigen Müll?", Wäre die vollständige Antwort erforderlich :-)
Steve Jessop
17

Entweder rm -- --testings.htmloder rm ./--testings.html.

Vatine
quelle
7
rm -- --testings.html
Juliano
quelle
4

Eine weitere Möglichkeit besteht darin, find ... -name "- *" -delete zu verwenden

touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 

quelle
3

Für einen allgemeineren Ansatz zum Löschen von Dateien mit unmöglichen Zeichen im Dateinamen besteht eine Option darin, den Inode der Datei zu verwenden.

Es kann über erhalten werden ls -i.

z.B

$ ls -lai | grep -i test
452998712 -rw-r--r--  1 dim   dim      6 2009-05-22 21:50 --testings.html

Und um es zu löschen, mit Hilfe von find:

$ find ./ -inum 452998712 -exec rm \{\} \;

Dieser Vorgang kann hilfreich sein, wenn Sie mit vielen Dateien mit Dateinamen-Besonderheiten arbeiten, da er leicht per Skript erstellt werden kann.

Dimitris
quelle
1
Das funktioniert nur, weil es rmmit dem Argument aufruft ./--testings.html. Es ist einfacher, einfach direkt zu tippen rm ./--testings.html- was auch nicht den gesamten Verzeichnisbaum durchlaufen muss. (Sie könnten Letzteres vermeiden, indem Sie verwenden -maxdepth 1.)
Keith Thompson
1
rm ./--testings.html

oder

rm -- --testings.html
Paul Smith
quelle