Wie lösche ich eine Datei, deren Name mit "-" beginnt (Bindestrich oder Minus)?

349

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 --helpvon 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?

Bryan Rehbein
quelle
1
Wäre toll, wenn diese Frage in "So löschen Sie eine Datei, deren Name mit - beginnt" umbenannt würde.
Sandy
@ Sandy Einverstanden; Normalerweise mag ich es nicht, die Bedeutung einer Frage zu ändern, aber in diesem Fall ist die akzeptierte Antwort spezifisch für dieses Problem
Michael Mrozek
33
Ich finde es ein bisschen ironisch, dass rm --helptatsächlich erklärt, wie man Dateinamen löscht, die mit einem beginnen -. gute frage trotzdem.
Lesmana
1
@ jw013 Manchmal ist die Hilfe für erfahrene Benutzer leicht zu verstehen, aber für Neulinge überwältigend und verwirrend.
Iconoclast
1
Ich bin auf einem System mit rm von BusyBox darauf gestoßen. Alles ist minimal, einschließlich der Hilfe, so dass rm --help keine Hinweise lieferte.
Dslake

Antworten:

497

Verwenden Sie "-", um rm anzuhalten, Befehlszeilenoptionen wie folgt zu analysieren:

rm -- --help
Vegar Nilsen
quelle
1
Ich wusste, dass es so etwas sehr einfaches war ...
Bryan Rehbein
2
rmUnterstützen alle Versionen des Befehls das --Argument?
Keith Thompson
3
@KeithThompson - ist eine Funktion der meisten GNU-Tools und funktioniert daher nicht auf den meisten Nicht-GNU-Unixen ("Nicht-Linux") (z. B. BSD-Varianten oder einige eingebettete Systeme)
dtech
1
VIELEN DANK! Das hat mir den Tag gerettet. Und natürlich funktioniert es unter BSD (OSX) und mit anderen Befehlen!
Raskhadafi
8
@dtech, getopt () und --vor GNU (SysIII, 1980) und sind Standard / POSIX. Standard-Dienstprogramme bis auf wenige Ausnahmen (wie echo) verstehen --. YMMV für andere Befehle, wenn sie die getopt () - API nicht zum Parsen von Optionen verwenden.
Stéphane Chazelas
214

Oder du kannst es tun

rm ./--help
edfuh
quelle
7
Nicht, dass es darauf ankommt, aber dies scheint das "Richtigste" zu sein.
James M.
2
Dies ist der, an den ich mich erinnere. Mit "rm - --help" muss ich immer nachsehen.
user603
25
Diese Methode funktioniert immer auch für Befehle, die nicht --speziell behandelt werden .
JW013
Und es funktioniert auch, um eine spezielle Behandlung von speziell benannten Argumenten durch einige Befehle für andere Typen (neben Optionen) zu vermeiden, wie die -von Text-Dienstprogrammen oder cddie foo=barvon awk...
Stéphane Chazelas
1
Dies funktioniert, wenn eine Datei mit einem einzelnen Bindestrich beginnt, wo rm -- <filename>dies nicht der Fall war .
StockB
37

Verwenden Sie find, um es zu tun:

find . -name '--help' -delete

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 -deleteOption ausführen und dann, wenn die Liste der Dateien gut aussieht, einfach ausführen es wieder mit -delete.

In der Tat, Sie vermeiden rmzugunsten von find(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:

find . -maxdepth 1 -name '--help' -delete

Dadurch wird die Suche auf das aktuelle Verzeichnis beschränkt.

aculich
quelle
Möglicherweise müssen Sie findeine Liste der zu untersuchenden Dateien / Verzeichnisse angeben. Also find . -name.... -deleteund -maxdepthsind auch keine Standardoptionen.
Stéphane Chazelas
21

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 -ioder in einer Form von ermittelt, statund dann wird die Datei entfernt, indem nach Dateien im aktuellen Verzeichnis anhand der Inode-Nummer gesucht und der rmBefehl für die Datei mit einer übereinstimmenden Inode-Nummer ausgeführt wird

find . -inode <inode> -exec rm {}\;

Da 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

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

in Ihre .inputrcDatei, wenn Sie Bash verwenden. Auf diese Weise können Sie die Liste der möglichen Abschlüsse durchlaufen ( für weitere Informationen ).

Baldur
quelle
5
Diese Methode hat zwei Probleme: 1) Verwenden Sie -exec rm nicht, wenn Sie -delete verwenden können; 2) Die Inode zu erhalten und diese zu verwenden, ist unnötig überkompliziert, wenn Sie nur find -name '--help' -delete
Folgendes
Ich denke nicht, dass das funktionieren wird. Es durchläuft alle Dateien im aktuellen Verzeichnis und all seinen Unterverzeichnissen und ruft schließlich immer noch auf rm --help, wodurch die Datei immer noch nicht entfernt wird. Verwenden Sie einfach rm ./--help(oder rm -i *.
Keith Thompson
1
@KeithThompson stellt findallen Dateien das Kommandozeilenargument path voran , damit es ausgeführt wird rm ./--helpund rm ./sub/dirs/--help. Um das zweite -maxdepth 1Problem zu beheben, müsste man hinzufügen , aber all dies führt im Wesentlichen dazu, dass die @ edfuh-Lösung komplizierter und -deletesicherer als je zuvor -exec rmangewendet wird.
JW013
1
Ein weiteres Problem bei diesem Befehl ist, dass zwischen {}und ein Leerzeichen stehen muss \;, sonst funktioniert es nicht.
Eugene S
Inodes können eindeutig sein, es können jedoch mehrere Verzeichniseinträge mit demselben Inode vorhanden sein. Diese werden als Hardlinks bezeichnet. Und sie sind nur pro Dateisystem eindeutig, sodass Sie sie verwenden müssen -xdev. Das wird dir nicht helfen, das zu machen ls -i --help.
Stéphane Chazelas
11

Eine brutale Lösung:

perl -e "unlink '--help' or die 'Could not unlink.';"

perl -e "rmdir '-d' or die 'Could not rmdir.';"
Thomas L. Holaday
quelle
8

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"

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

Finde es zuerst mit find:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

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:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

Aaaannd es ist weg.

Eric Leschinski
quelle
2

Midnight Commander ( mc) ist am einfachsten, zeig einfach darauf und drücke F8;)

Marcin
quelle
3
Das OP möchte eine Befehlszeilenlösung (CLI).
Francesco Turco
1
Midnight Commander ist eine CLI-Lösung. Verwenden Sie einfach Ihren Paket-Manager, um es zu installieren. (Es funktioniert sogar über ssh ...) en.wikipedia.org/wiki/Midnight_Commander
daviewales
6
Wie ist apt-get install mc || yum install mc; mc verschiedene Pfeiltasten und F8 einfacher als rm ./--help?
Josh
3
@daviewales: Midnight Commander wird gestartet von der Kommandozeile, und es läuft im Terminal, aber alle Tastaturaktionen innerhalb Midnight Commander sind nicht von der CLI (Command Line Interface) - sie sind von Midnight Commander der Schnittstelle. - In der Regel können Befehlszeilendienstprogramme innerhalb eines Skripts ausgeführt werden (eine Ausnahme ist der Bash-Befehlszeilenverlauf).
Peter.O
1

Hier ist eine Lösung, die ich verwendet hatte, bevor ich diesen Thread gefunden habe.
Verwenden Sie vimdiese Option, um das Verzeichnis zu bearbeiten:

vim .

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

atti
quelle
0

Haben Sie versucht, den Verzeichnisnamen als Präfix hinzuzufügen:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

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.

Paulo Henrique Lellis Gonalves
quelle
1
Ich glaube, dass dies bereits in einer früheren Antwort behandelt wurde .
Kusalananda
-3

Wenn Sie die Datei umbenennen möchten -.bar, versuchen Sie Folgendes:

cat >foo.bar <-.bar

bevor Sie den Befehl verwenden:

rm -- -.bar

Sie sollten in der Lage sein, den Inhalt der Originaldatei in foo.bar zu überprüfen

Stephen Menasian
quelle
4
Das Erstellen einer Kopie der Datei ist keine sehr effiziente Lösung zum Umbenennen.
JW013
1
Sie könnten Vidir verwenden; aber das ist wahrscheinlich genauso (oder noch mehr) ineffizient - und viel gefährlicher.
Stephen Menasian