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?
Antworten:
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
quelle
Während das funktioniert, ist es eine Lösung, die auf der
rm
Verwendung 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:
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 Beispielrm
werden Dateien gelöscht Aber überspringen Sie Verzeichnisse, währendrm -rf *
alles gelöscht wird. Wenn Sie einen Dateinamen von "-rf
" an ein Skript oder an jemanden übergebentouch ~victim/-rf
, kann dies dazu verwendet werden, sein Verhalten mit wirklich schlimmen Konsequenzen zu ändern.quelle
Entweder
rm -- --testings.html
oderrm ./--testings.html
.quelle
quelle
Eine weitere Möglichkeit besteht darin, find ... -name "- *" -delete zu verwenden
touch -- --file find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete
quelle
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.
quelle
rm
mit dem Argument aufruft./--testings.html
. Es ist einfacher, einfach direkt zu tippenrm ./--testings.html
- was auch nicht den gesamten Verzeichnisbaum durchlaufen muss. (Sie könnten Letzteres vermeiden, indem Sie verwenden-maxdepth 1
.)oder
quelle