2009-04-01 12 views
66

Ich habe einige Dateien auf meinem Unix-Maschine, die mitSo entfernen Sie Dateien beginnend mit Doppel Bindestrich?

-- 

z beginnen --testings.html

Wenn ich versuche, es ich folgende Fehlermeldung erhalten zu entfernen:

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

I

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

aber nichts funktioniert.

Wie kann ich solche Dateien auf dem Terminal entfernen?

+0

Identisch mit [serverfault] (https://serverfault.com/questions/47003/deleting-a-unix-directory-with-a-hyphen-in-the-name) und [unix] (https: // unix.stackexchange.com/questions/1519/how-do-i-delete-a-file-whose-name-beginnt-with-hyphen-aka-dash-or-minus). – Dorian

+1

@Dorian Nun gut, aber ich war zuerst :) – cb0

Antwort

140
rm -- --testings.html 

Die -- Option rm sagt alle weiteren Argumente als Dateinamen zu behandeln, nicht als Optionen, auch wenn sie mit - starten.

Dies ist nicht speziell für den Befehl rm. Die Funktion getopt implementiert sie, und viele (alle?) Befehle im UNIX-Stil behandeln es auf die gleiche Weise: -- beendet die Verarbeitung von Optionen und alles, nachdem es ein reguläres Argument ist.

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

+0

genau das, was ich brauche, danke – cb0

+4

Dies ist nicht Standard über alle Versionen von Unix, obwohl es am meisten funktioniert. Siehe die Antwort von vatine für eine Alternative, die mit allen Versionen funktioniert. –

17

Entweder rm -- --testings.html oder rm ./--testings.html.

1
rm ./--testings.html 

oder

rm -- --testings.html 
55
rm -- --somefile 

Während das funktioniert, dann ist es eine Lösung, die für die Analyse seiner Optionen auf rm mit getopts beruht. Es gibt Anwendungen, die ihr eigenes Parsing durchführen und das auch kotzen werden (weil sie nicht notwendigerweise die Logik " bedeutet Ende der Optionen" implementieren).

Diesem Grund, die Lösung, die Sie durch den Schädel fahren sollte, ist dieses:

rm ./--somefile 

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

Darüber hinaus, wenn Sie versuchen, wirklich anständige Shell-Skripte zu machen; Sie sollten technisch ./ vor all Ihren Dateinamenerweiterungen setzen, um zu verhindern, dass Ihre Skripte aufgrund der unkonventionellen Dateinameneingabe zerbrechen (oder um zu verhindern, dass sie missbraucht/missbraucht werden, um Dinge zu tun, die sie nicht tun sollten): zum Beispiel rm wird Löschen Sie Dateien, aber überspringen Sie Verzeichnisse, während rm -rf * alles löschen. Übergeben Sie einen Dateinamen von "-rf" an ein Skript oder jemanden touch ~victim/-rf 'könnte auf diese Weise verwendet werden, um sein Verhalten mit wirklich schlimmen Folgen zu ändern).

+2

+1, weil Sie Recht haben, aber Skripte kugelsicher machen ist ein ganz anderes Problem neben dem Umgang mit einem unangenehmen Dateinamen. Wenn die Frage war: "Wie entferne ich Dateien, die mit Bindestrichen beginnen, Leerzeichen,;, <>, $ und anderen bösartigen Unsinn?" –

4

Noch eine andere Möglichkeit, es zu tun ist, zu suchen ...-name „- *“ -delete

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

Für einen allgemeineren Ansatz für Dateien mit unmöglichen Zeichen im Dateinamen zu löschen, ist eine Option, die Inode der Datei zu verwenden.

Es kann über ls -i erhalten werden.

z.B.

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

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

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

Dieser Prozess kann von Vorteil sein, wenn mit vielen Dateien mit dem Dateinamen Besonderheiten zu tun, da es leicht scripted werden kann.

+1

Das funktioniert nur, weil '' rm' 'mit aufgerufen wird das Argument "./-- testings.html". Es ist einfacher, 'rm ./-- testings.html' direkt einzugeben - das muss auch nicht den gesamten Verzeichnisbaum durchlaufen. (Sie könnten letzteres vermeiden, indem Sie '-maxdepth 1' verwenden.) –

Verwandte Themen