Entfernen Sie die GET-Parameter aus den Dateinamen im Verzeichnis

1

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/' *
Artem Gordinsky
quelle
Ich bin nicht mit dem Umbenennungsdienstprogramm vertraut. Wählt find . -name \?* -lsaber alle Dateien aus, die mit einem Fragezeichen beginnen. Sie können das -ls durch ein mv und einen basenamen ersetzen.
Hennes
1
Debian und Red Hat haben jeweils einen renameBefehl. Aber sie sind sehr unterschiedlich. Sie haben nicht erwähnt, welchen renameBefehl Sie verwenden, und die Argumente, die Sie verwendet haben, sehen nicht so aus, als wären sie für beide geeignet.
Kasperd
@kasperd Sorry, hätte nicht gedacht, dass das Betriebssystem eine Rolle spielen würde. Meins ist CentOS.

Antworten:

2

Das ist ganz einfach:

Wir arbeiten in einer for-Schleife an jeder Datei, deren Name ein ' ?' enthält .

Diese for-Schleife ruft einen mvBefehl (== umbenennen) mit all diesen Dateien sowie diesen Dateinamen ohne ihren Teil danach auf ' ?'.

Der genaue Befehl lautet wie folgt:

for i in *\?*;do mv -vf "${i}" "${i%%\?*}";done

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.

Peterh
quelle