Benennen Sie die Dateien im lokalen Ordner um, indem Sie ein Präfix oder Suffix hinzufügen

12

Ich habe viele Dateien in einem Ordner und möchte ihnen entweder ein Präfix oder ein Suffix (nicht beides ) hinzufügen . Ich habe hier nachgesehen und herausgefunden, dass ich es verwenden kann

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

um allen Dateien, die auf enden, ein Präfix hinzuzufügen .jpg(und wenn ich das entferne .jpg, wird das Präfix allen Dateien im aktuellen Ordner hinzugefügt).

Ich würde es aber gerne können

  • Ein Sufix hinzufügen (dh umbenennen filename.extin filename.whatever.ext),
  • Überprüfen Sie, ob das Präfix oder Suffix bereits vorhanden ist, und überspringen Sie dann
  • Erstellen Sie einen Alias, der Argumente wie addprefix whatever *.extoder akzeptiertaddsufix whatever *.*
Dieser Brasilianer
quelle

Antworten:

10

Wenn Sie verwenden bash, dann ist dieser Einzeiler es für Sie tun kann (vorausgesetzt , Sie haben die Variablen $prefix, $suffixund $extensionleicht verfügbar)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Sie könnten Ihre Skripte so haben

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

und

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done
Aaron Okano
quelle
Das ist fast perfekt! Es wäre perfekt, wenn (1) geprüft würde, ob das Präfix oder Suffix bereits vorhanden ist (und dann übersprungen wird), und (2) Dateien ohne Erweiterung bearbeitet würden. Tut mir leid, dass ich so viel gestört habe ...
Der Brasilianer
Für (1) können Sie (glaube ich, nicht getestet) die Präfixprüfung hinzufügen, indem Sie das mv in ein umhüllen, if [ $f == $prefix* ]und Sie können das Suffix eins mit if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]den paar mv-Befehlen in additivesuffix ändern. Für (2) sollte es bereits mit Dateien ohne Erweiterung funktionieren, es sei denn, ich bin ein schrecklicher Programmierer.
Aaron Okano
7

Es gibt einen Perl- renameBefehl , der den Trick machen sollte. Beachten Sie jedoch: Es gibt verschiedene Befehle, die aufgerufen renamewerden. Stellen Sie also sicher, dass Sie das Perl-Skript haben, das perlexprals Argument a erwartet . Dies ist der renameBefehl, der vom perlPaket für Debian und Derivate (Ubuntu, Mint,…) bereitgestellt wird , jedoch nicht für andere Distributionen, die möglicherweise ein anderes Hilfsprogramm haben rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Wie Sie sehen, ist es idempotent - es wird das Präfix nicht erneut hinzufügen, wenn Sie es mehrmals aufrufen.

Es funktioniert, indem entweder der (Null-) Anfang der Zeichenfolgen ( ^) oder der Anfang, gefolgt von einer optionalen prefixZeichenfolge, durch ersetzt wird prefix.

Ich lasse dies entweder in einem Shell-Skript oder einer Shell-Funktion als Übung für Sie einkapseln :)

Postfix ist allerdings etwas schwieriger, da Sie herausfinden müssen, welcher Teil des Dateinamens die Erweiterung darstellt ...

Martin von Wittich
quelle
Das ist eine schöne Antwort, aber ich habe nach etwas Universellerem gesucht. Für diese Antwort benötigen Sie sowohl Perl als auch dieses spezifische (oder äquivalente) renameElement. Und ich weiß, dass Suffixe etwas schwieriger sind, es wurde in der verknüpften Frage nicht behandelt, und ich bin ein Anfänger in Linux, Bash, Shell-Skript, Perl und regulären Ausdrücken, also ist "etwas schwieriger" für mich ziemlich schwierig ! :)
Der Brasilianer
4

Mit zsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~ist der Globbing-Operator, der außer in bedeutet zsh.

Stéphane Chazelas
quelle
1

Einfaches Beispiel, um das Präfix und die Erweiterung aller Bilder im aktuellen Ordner zu ändern.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Wenn Sie überprüfen möchten, wie sich dies auf Ihre Daten auswirken würde, bevor Sie sie ändern, ersetzen Sie das MV durch Echo

Die Ausgabe für IMG_7993.JPG ist EG_IMG_7993.jpg

Jinxi
quelle