Ich muss den Teil, der mit beginnt, ?
aus einer Reihe von Dateien mit Namen wie entfernen image.jpg?foo=bar&bar=foo
. Kann mir bitte jemand zeigen, wie es geht?
Diese Befehle funktionieren aus irgendeinem Grund nicht:
rename "\?." "" *
rename 's/(.*)\.jpg\?.*/$1\.jpg/' *
find . -name \?* -ls
aber alle Dateien aus, die mit einem Fragezeichen beginnen. Sie können das -ls durch ein mv und einen basenamen ersetzen.rename
Befehl. Aber sie sind sehr unterschiedlich. Sie haben nicht erwähnt, welchenrename
Befehl Sie verwenden, und die Argumente, die Sie verwendet haben, sehen nicht so aus, als wären sie für beide geeignet.Antworten:
Das ist ganz einfach:
Wir arbeiten in einer for-Schleife an jeder Datei, deren Name ein '
?
' enthält .Diese for-Schleife ruft einen
mv
Befehl (== umbenennen) mit all diesen Dateien sowie diesen Dateinamen ohne ihren Teil danach auf '?
'.Der genaue Befehl lautet wie folgt:
Was vielleicht etwas kryptisch wirkt, ist das
"${i%%\?*}"
. Das heißt: "Die Variable mit dem Namen 'i' hat nach einem '?
' alles von ihrem Ende entfernt .Es gibt auch etwas Kryptisches, das ist der Teil
*\?*
. Es bedeutet jede Datei im aktuellen Verzeichnis, deren Name ein '?
' enthält . Dies ist ein Muster, genau wie in (win) do (w), der einzige Unterschied ist, dass das '?
' standardmäßig jedes Zeichen bedeutet. Der Backslash ('\
') wird verwendet, um diese spezielle Bedeutung daraus zu entfernen.quelle