Wie entferne ich eine Datei, deren Dateiname mit einem Bindestrich (Bindestrich oder Minus) beginnt -
? Ich bin in einen Remote-OSX-Server eingebunden und habe diese Datei in meinem Verzeichnis:
tohru:~ $ ls -l
total 8
-rw-r--r-- 1 me staff 1352 Aug 18 14:33 --help
...
Wie in aller Welt kann ich --help
von einer CLI löschen ? Dieses Problem tritt gelegentlich in verschiedenen Formen auf. Diese Dateien sind einfach zu erstellen, aber schwer zu beseitigen.
Ich habe versucht, Backslash zu verwenden
rm \-\-help
Ich habe es mit Zitaten versucht
rm "--help"
Wie verhindere ich, dass das Minuszeichen (Bindestrich oder Bindestrich) als Option interpretiert wird?
rm --help
tatsächlich erklärt, wie man Dateinamen löscht, die mit einem beginnen-
. gute frage trotzdem.Antworten:
Verwenden Sie "-", um rm anzuhalten, Befehlszeilenoptionen wie folgt zu analysieren:
quelle
rm
Unterstützen alle Versionen des Befehls das--
Argument?--
vor GNU (SysIII, 1980) und sind Standard / POSIX. Standard-Dienstprogramme bis auf wenige Ausnahmen (wieecho
) verstehen--
. YMMV für andere Befehle, wenn sie die getopt () - API nicht zum Parsen von Optionen verwenden.Oder du kannst es tun
quelle
--
speziell behandelt werden .-
von Text-Dienstprogrammen odercd
diefoo=bar
vonawk
...rm -- <filename>
dies nicht der Fall war .Verwenden Sie
find
, um es zu tun:Und dies ist eine gute Methode, denn wenn Sie mehr als ein paar Dateien wie diese haben, die Sie löschen können, können Sie eine Vorschauliste der Dateien erhalten, indem Sie einfach find ohne die
-delete
Option ausführen und dann, wenn die Liste der Dateien gut aussieht, einfach ausführen es wieder mit-delete
.In der Tat, Sie vermeiden
rm
zugunsten vonfind
(vor allem mit Vorschau zuerst) ist eine gute Gewohnheit , die Sie Fehler mit vermeiden helfen ,rm *
dass werden Sie unweigerlich eines Tages beißen.Beachten Sie jedoch, dass dieser Suchvorgang alle Ihre Unterverzeichnisse durchläuft. Daher möchten Sie ihn möglicherweise mit einer Tiefenbeschränkung für Unterverzeichnisse wie der folgenden ausführen:
Dadurch wird die Suche auf das aktuelle Verzeichnis beschränkt.
quelle
find
eine Liste der zu untersuchenden Dateien / Verzeichnisse angeben. Alsofind . -name...
.-delete
und-maxdepth
sind auch keine Standardoptionen.Die Antworten von Vegar Nilsen und edfuh sind sehr gut und die richtigen Lösungen für ein Problem wie dieses.
Ich möchte eine allgemeine Antwort auf diese Frage hinzufügen, mit der Sie jede Datei mit einem schwierigen Dateinamen löschen können . Zuerst wird die Inode-Nummer mit
ls -i
oder in einer Form von ermittelt,stat
und dann wird die Datei entfernt, indem nach Dateien im aktuellen Verzeichnis anhand der Inode-Nummer gesucht und derrm
Befehl für die Datei mit einer übereinstimmenden Inode-Nummer ausgeführt wirdDa Inode-Nummern in jedem Dateisystem eindeutig sind, können Sie jede Datei mit dieser Option entfernen. Unicode oder mit Escape-Zeichen. Es ist jedoch sehr ärgerlich zu tippen, daher würde ich empfehlen, die Zeile hinzuzufügen
in Ihre
.inputrc
Datei, wenn Sie Bash verwenden. Auf diese Weise können Sie die Liste der möglichen Abschlüsse durchlaufen ( für weitere Informationen ).quelle
find -name '--help' -delete
rm --help
, wodurch die Datei immer noch nicht entfernt wird. Verwenden Sie einfachrm ./--help
(oderrm -i *
.find
allen Dateien das Kommandozeilenargument path voran , damit es ausgeführt wirdrm ./--help
undrm ./sub/dirs/--help
. Um das zweite-maxdepth 1
Problem zu beheben, müsste man hinzufügen , aber all dies führt im Wesentlichen dazu, dass die @ edfuh-Lösung komplizierter und-delete
sicherer als je zuvor-exec rm
angewendet wird.{}
und ein Leerzeichen stehen muss\;
, sonst funktioniert es nicht.-xdev
. Das wird dir nicht helfen, das zu machenls -i --help
.Eine brutale Lösung:
quelle
Linux Exemplarische Vorgehensweise zum Erstellen einer Datei mit Bindestrichen und Leerzeichen und zum anschließenden Entfernen.
ACHTUNG! Führen Sie nicht versehentlich einen
rm -rf /
oder einen ähnlichen Kaskadenlöschbefehl aus.Wenn Sie Ihre Datei , die Sie Sternchen oder Schrägstriche zu entfernen versuchen , schließt nicht aus Versehen eine Pumpe
.
oder/*
oder*
oder eine andere Wildcard , die Ihr Betriebssystem löschen Kaskade könnte.Erstelle eine Datei mit dem Namen "--yo yo"
Finde es zuerst mit find:
Stellen Sie sicher, dass der Befehl find NUR die EINE Datei findet, die Sie löschen möchten:
Übergeben Sie dann die Option -delete, um sie zu finden und zu löschen:
Aaaannd es ist weg.
quelle
Midnight Commander (
mc
) ist am einfachsten, zeig einfach darauf und drücke F8;)quelle
apt-get install mc || yum install mc; mc
verschiedene Pfeiltasten und F8 einfacher alsrm ./--help
?Hier ist eine Lösung, die ich verwendet hatte, bevor ich diesen Thread gefunden habe.
Verwenden Sie
vim
diese Option, um das Verzeichnis zu bearbeiten:dann (in vim) wählen sie ihre datei aus, drücken sie del und bestätigen sie den löschvorgang.
Wenn Sie fertig sind, beenden Sie vim mit
:q
quelle
Haben Sie versucht, den Verzeichnisnamen als Präfix hinzuzufügen:
Die Verwendung des Verzeichnisses als Präfix der Datei hilft im Allgemeinen dabei, die falsche Interpretation des Minuszeichens als Befehlsoption durch die Parserfunktion zu vermeiden.
quelle
Wenn Sie die Datei umbenennen möchten
-.bar
, versuchen Sie Folgendes:bevor Sie den Befehl verwenden:
Sie sollten in der Lage sein, den Inhalt der Originaldatei in foo.bar zu überprüfen
quelle