
Ich muss alle Dateien mit diesen Namen löschen (die Anführungszeichen sind Teil des Namens):
'index.html?some-query-string'
Ich habe es versucht mit:
rm \'index.html?*\'
Ich erhalte diesen Fehler:
rm: cannot remove ''\''index.html?*'\''': No such file or directory
Antwort1
Analyse
die Anführungszeichen sind Teil des Namens
Bist du sicher? Woher weißt du das? Es gibt das"Feature" des modernen GNUls
, daher druckt es Namen mit zusätzlichen Anführungszeichen, wo immer Zeichen wie ?
darin stehen; wenn also ein absoluter Laie beispielsweise kopiert, einfügt 'index.html?some-query-string'
und ausführt rm 'index.html?some-query-string'
, ist dies der richtige, sichere Befehl.
Leider kann dies versiertere Benutzer verwirren, die wissen, dass sie einige Zeichen in Anführungszeichen setzen/maskieren sollten. Ihr rm
Befehl ( rm \'index.html?*\'
) ist für den Namen mit Anführungszeichen in Ordnung. Er kann auf mehr Dateinamen passen, da es ?*
sich um ein Glob-Muster handelt. Ich gehe davon aus, dass dies das ist, was Sie wollen, da Sie geschrieben haben: „Ich muss alle Dateien löschen“. Die Tatsache, dass der Befehl Ihnen gegeben hat, No such file or directory
lässt mich glauben, dass die vorhandenen Namen tatsächlich anders sind.
Um dies zu bestätigen, führen Sie aus ls -N
. Wenn dieser Befehl erfolgreich ist und Namen wieindex.html?some-query-string
ohne AnführungszeichenDanndiesesind die wirklichen Namen.
Lösung
Dieser Teil der Antwort geht davon aus, dass es sich bei Ihrem System ls
um ein modernes GNU ls
oder ähnlich „intelligent“ handelt, sodass die betreffenden Anführungszeichen nicht zum Dateinamen gehören.
Um eine bestimmte Datei zu entfernen, verhalten Sie sich wie ein absoluter Laie, der 'index.html?some-query-string'
in die Ausgabe von "smart" sieht ls
, oder wie ein Benutzer, der sich der Notwendigkeit von Anführungszeichen bewusst ist (ich glaube, das sind Sie), der index.html?some-query-string
in die Ausgabe von sieht ls -N
. Führen Sie aus:
rm 'index.html?some-query-string'
Oder wenn Sie alle Dateien entfernen möchten, deren Namen mit beginnen index.html?
:
rm 'index.html?'*
Die Shell entfernt die Anführungszeichen, sie gelangen nicht zu rm
. Die einfachen Anführungszeichen ?
werden nicht als Platzhalter behandelt, sie werden rm
wörtlich an übergeben. Die Anführungszeichen ohne *
werden als Platzhalter behandelt, sie passen zu jeder Abfragezeichenfolge, die Shell übergibt möglicherweise mehrere passende Dateinamen als Argumente an rm
.
Antwort2
Wenn '
dies ein Teil des Namens Ihrer Dateien ist, empfehle ich, den Befehl „Find“ zusammen mit " "
der Übergabe des Namensmusters für Ihren Befehl zu verwenden.
Ein Beispiel, das Sie verwenden können, ist:
find . -maxdepth 1 -type f -name "'index.html?*'" -exec rm {} \;