web-dev-qa-db-de.com

Benennen Sie mehrere Dateien um, aber benennen Sie nur einen Teil des Dateinamens in Bash um

Ich weiß, wie ich Dateien umbenennen kann, aber ich habe Probleme damit.

Ich muss nur test-this In einer for-Schleife umbenennen.

test-this.ext
test-this.volume001+02.ext
test-this.volume002+04.ext 
test-this.volume003+08.ext 
test-this.volume004+16.ext 
test-this.volume005+32.ext 
test-this.volume006+64.ext 
test-this.volume007+78.ext 
45
user3115029

Wenn Sie alle diese Dateien in einem Ordner haben und unter Linux arbeiten, können Sie Folgendes verwenden:

rename 's/test-this/REPLACESTRING/g' *

Das Ergebnis wird sein:

REPLACESTRING.ext
REPLACESTRING.volume001+02.ext
REPLACESTRING.volume002+04.ext
...

rename kann einen Befehl als erstes Argument annehmen. Der Befehl besteht hier aus vier Teilen:

  1. s: Flag, um eine Zeichenfolge durch eine andere Zeichenfolge zu ersetzen,
  2. test-this: Die Zeichenfolge, die Sie ersetzen möchten,
  3. REPLACESTRING: Die Zeichenfolge, durch die die Suchzeichenfolge ersetzt werden soll, und
  4. g: Ein Flag, das angibt, dass alle Übereinstimmungen der Suchzeichenfolge ersetzt werden sollen, d. h. wenn der Dateiname test-this-abc-test-this.ext lautet, ist das Ergebnis REPLACESTRING-abc-REPLACESTRING.ext.

Eine detaillierte Beschreibung der Flags finden Sie unter man sed.

101
Tim Zimmermann

Verwenden Sie rename wie unten gezeigt:

rename test-this foo test-this*

Dies ersetzt test-this mit foo in den Dateinamen.

Wenn Sie nicht über rename verfügen, verwenden Sie eine for -Schleife wie folgt:

for i in test-this*
do
    mv "$i" "${i/test-this/foo}"
done
44
dogbane

Funktion

Ich bin auf OSX und meine Bash kommt nicht mit rename als integrierte Funktion. Ich erstelle eine Funktion in meinem .bash_profile, das das erste Argument übernimmt, das ein Muster in der Datei ist, das nur einmal übereinstimmen sollte, und sich nicht darum kümmert, was danach kommt, und durch den Text von Argument 2 ersetzt.

rename() {
    for i in $1*
    do
        mv "$i" "${i/$1/$2}"
    done
}

Eingabedateien

test-this.ext
test-this.volume001+02.ext
test-this.volume002+04.ext 
test-this.volume003+08.ext 
test-this.volume004+16.ext 
test-this.volume005+32.ext 
test-this.volume006+64.ext 
test-this.volume007+78.ext 

Befehl

rename test-this hello-there

Ausgabe

hello-there.ext
hello-there.volume001+02.ext
hello-there.volume002+04.ext 
hello-there.volume003+08.ext 
hello-there.volume004+16.ext 
hello-there.volume005+32.ext 
hello-there.volume006+64.ext 
hello-there.volume007+78.ext 
10
Joe Flack