Entfernen Sie die Linux-Datei mit dem Namen Shell-Responsive-Zeichen

7

Ich habe eine Datei mit dem Namen erstellt \;:$"\', um eine meiner Software zu testen. Ich habe einen Fehler erhalten, weil ich die Dateieigenschaft nicht löschen kann. Ich versuche eine genaue Zeichenkombination zu finden, über rmdie ich sie entfernen kann , aber ich kann keinen Weg finden.

rm \\;:$\"\\\'
rm: cannot remove `\\': No such file or directory

rm "\\"\;:$\"\\\'
rm: cannot remove `\\;:$"\\\'': No such file or directory

rm '\;:$"\'''
rm: cannot remove `\\;:$"\\': No such file or directory

(Dieser letzte Versuch hat mich umgebracht)

Und viele, viele andere Versuche. Helfende Hand gebraucht!

Alex
quelle
2
mögliches Duplikat von Bash - Verzeichnissen, die auf enden. und Leerzeichen können nicht entfernt werden - obwohl die Frage nicht genau dieselbe ist, können dieselben Techniken zum Entfernen von Dateien mit einem seltsamen Namen verwendet werden.
ein CVn
Ich werde einen Blick darauf werfen. Dieser Fall ist weitaus komplexer, da ein Schrägstrich nicht ausreicht, um ansonsten gerade Parsing-Zeichen als Leerzeichen zu analysieren.
Alex
Die einfache allgemeine Methode zum Entfernen von Dateien mit ungünstigen Namen besteht darin rm -i ./*, dass Sie auswählen müssen, ob jede Datei im Verzeichnis gelöscht werden soll oder nicht. Wenn Sie einen spezifischeren Glob eingeben können, tun Sie dies - in diesem Fall würde ich versuchen, rm -i ./*:*da :dies für die Shell in diesem Kontext nicht von Bedeutung ist.
zwol
@ MichaelKjörling Ich bin mir sicher, dass diese Frage schon einmal gestellt und beantwortet wurde, aber der bestimmte Betrüger, den Sie gefunden haben, ist keine gute Wahl. Es scheint eine Reihe falscher Antworten angezogen zu haben, die Sie möglicherweise in die Irre geführt haben - es ist der schlimmere Fall: "Ich habe irgendwie eine Datei erstellt, deren Name Zeichen enthält, die das Dateisystem normalerweise nicht zulässt, und jetzt kann ich sie nicht mehr loswerden." . "
zwol

Antworten:

12

Wenn der Dateiname genau ist \;:$"\', sollten Sie ihn entfernen können mit:

rm \\\;\:\$\"\\\'

Entfliehen Sie einfach alle Charaktere mit einem einzigen \.

Chaos
quelle
Danke Chaos. Ich wollte überall Backslashes vermeiden (außerdem befürchte ich, dass diese Methode bei einigen GNU-Befehlen fehlschlagen könnte). Die richtige Antwort wäre: \\\ ;: $ \ "\\\ ', aber ich nehme Ihre als gültig.
Alex
4
@Alex Wenn die Umgebung Ihres Programms über eine Bibliotheksfunktion zum Shell-Escape-String verfügt, sollten Sie diese verwenden. Wenn Sie sich in einer interaktiven Shell-Umgebung mit Tab-Vervollständigung befinden, finde ich das äußerst praktisch, um Dateien mit seltsamen Namen zu bearbeiten!
Riking
Ich kenne. Ich finde das logisch. Aber leider nicht der Fall.
Alex
5

Sie können versuchen, ls -liin dem Verzeichnis, das die Datei enthält, die Datei mit dem durch die Ausgabe zurückgegebenen Inode zu löschenfind . -inum <inode-number> -exec rm -i {} \;

Ich -ihabe den Befehl zum Suchen hinzugefügt , um ihn vor dem Löschen aufzufordern, falls der Befehl find eine andere Datei findet als erwartet.

Zusätzlich zu dem Kommentar habe ich versucht, die Datei selbst zu erstellen und zu entfernen:

ls -l
total 0
-rw-r--r-- 1 test test 0 mrt 24 14:11 \;:$"\'

[test@testhost +1] /tmp/ff$ rm \\\;\:\$\"\\\' 

[test@testhost +1] /tmp/ff$ ls -l
total 0
Lambert
quelle
Ich würde lieber den richtigen Bash-Befehl verwenden. Ich könnte die Inode-Markierung als letzten Versuch verwenden, aber ich würde mich lieber auf den Befehl bash konzentrieren.
Alex
In meinem Fall hat rm \\\;\:\$\"\\\'funktioniert
Lambert
1
Wenn die Datei mehrere (feste) Links enthält, werden alle im Verzeichnis entfernt.
Brian
Daher -ikönnen Sie nur die Datei auswählen, die Sie tatsächlich entfernen möchten.
Lambert
2

Sie können einfache Anführungszeichen verwenden und müssen sich dann nur noch um das Anführungszeichen selbst kümmern.

rm '\;:$"\'\'

Bei der interaktiven Verwendung können Sie einfach die Tab-Vervollständigung verwenden, beginnend mit '\oder \\. Tab-Vervollständigung aus '\Erträgen '\;:$"\'\''', da bash einfach jedes eingebettete einfache Anführungszeichen durch ersetzt '\''. Tab-Vervollständigung aus dem Nichts oder aus \\Erträgen \\\;\:\$\"\\\'.

Random832
quelle
2

In Bash und ähnlichen Muscheln

read -r; rm "$REPLY"

\;:$"\'Geben Sie dann einfach den Dateinamen wörtlich ein und drücken Sie die Eingabetaste. Der readBefehl liest eine Zeile aus der Standardeingabe und speichert sie in der Variablen REPLY. Das -rFlag weist es an, die Zeile wörtlich zu lesen und Backslashes nicht als Escape-Sequenzen zu interpretieren. Zitiert $REPLYstellt sicher , dass der Inhalt REPLYwird übergeben werden rmals ein einziges Argument so dass diese auch noch funktionieren , wenn der Dateiname Leerzeichen oder Tabulatoren enthält.

(Hinweis: Wenn der Dateiname Zeilenumbruchzeichen enthält, können Sie anscheinend die -dOption verwenden read, um das Abschlusszeichen für die Zeichenfolge zu ändern, die Sie eingeben möchten.)

Brian
quelle
1

Wenn Sie nicht auf die Verwendung von Bash oder einer anderen Shell-Skriptumgebung beschränkt sind, können Sie eine solche Datei wahrscheinlich einfach entfernen, indem unlink()Sie entweder ein kurzes Programm schreiben, das einfach in Ihrer Lieblingssprache aufruft , oder einen Dateimanager wie Gnome Commander oder Midnight verwenden Commander zum manuellen Löschen der Datei. Mit der letzteren Option können Sie die betreffende Datei auswählen und löschen, ohne jemals irgendwo den Dateinamen eingeben zu müssen, wodurch die Möglichkeit ausgeschlossen wird, dass Metazeichen überhaupt eine besondere Bedeutung haben.

ein CVn
quelle
0

Versuche dies,

$ rm \\\;\:\$\"\\\'

"\" wird als Escape-Sequenz in Bash-Skripten verwendet, die eine litrale Bedeutung haben.

Vengat
quelle
1
Hallo Vengat, und willkommen bei Super User. Obwohl mir klar ist, dass Ihre Antwort sehr bald nach der des Chaos veröffentlicht wurde, möchten wir, dass sich die Antworten differenzieren. Können Sie vielleicht etwas hinzufügen, das noch nicht in der Antwort des Chaos war?
ein CVn
0

Ich finde es in solchen Fällen am einfachsten, höchstens ein paar Zeichen einzugeben / zu maskieren und dann bash den Befehl vervollständigen zu lassen mit <TAB>: bash stellt dann sicher, dass das für seine eigenen Zwecke geeignete Material zitiert wird.

In diesem Fall, wenn ich es tue

touch '\;:$"\'\'
rm \ <TAB>

Die Fertigstellung für wiederholte <TAB>anschließend geht an

rm \\
rm \\\\
rm \\\\\\\\
rm \\\;\:\$\"\\\' 

Jetzt bin ich eigentlich etwas ratlos, wenn ich die Zwischenstufen erkläre, aber der endgültige Vorschlag ist sinnvoll.

Als Faustregel, wenn ich die Vervollständigung nicht verwende, neige ich dazu, alles zu zitieren, indem ich es in '...'Markierungen einfüge. Offensichtlich müssen Sie sich dann 'selbst schreiben , indem Sie '\''die Anführungszeichen beenden, schreiben \;, um eine einzelne 'Zeichenfolge zu erstellen, und eine andere Zeichenfolge in Anführungszeichen erneut eingeben. Das ist das Rezept, das ich für den Touch-Befehl verwendet habe, außer dass das endgültige Ergebnis weggelassen wurde, ''da es nichts hinzufügt.

user431067
quelle
0

Eine weitere gute Lösung zu installieren oh-my-zsh ,
Typ rm und Reiter über auf die Datei , die Sie löschen möchten. ;)

Trevor Hickey
quelle