Krename regular expressions

Hallo,

ich krieg es leider nicht hin.

Ich muss in einem ziemlich umfangreichen Ordner zigtausende Dateien umbenennen.

Diese Dateien heissen alle der Form nach so:

mydatafile (unnecessarypart01234).dat

inklusive dem Leerzeichen, zwei runden Klammern und darin einer Sortierungszahl, die mehrere Stellen haben kann.

Nun müssen diese Dateien so umbenannt werden, dass das Leerzeichen, die runden Klammern sowie der Text dazwischen entfällt und stattdessen ein Zähler eingefügt wird.

Also so:

mydatafile_0001.dat

Wie löse ich das mit krename?

Ich finde in der Hilfe zu krename nichts über „suche bis zu einem Zeichen ‚X‘“ oder „suche das Zeichen ‚X‘ und lasse den Teil bis ‚Y‘ weg.“

Anzumerken wäre, dass der „mydatafile“ Teil verschieden lang sein kann, und dass die 01234 1 bis 5 Stellen haben kann.

Danke für jeden Tipp und viele Grüße,
Crypto.

Hallo Crypto,

Diese Dateien heissen alle der Form nach so:
mydatafile (unnecessarypart01234).dat

Nun müssen diese Dateien so umbenannt werden, dass das
Leerzeichen, die runden Klammern sowie der Text dazwischen
entfällt und stattdessen ein Zähler eingefügt wird.

mydatafile_0001.dat
Wie löse ich das mit krename?

Ich habe das krename nicht installiert, kann es also nicht ausprobieren. Aber im Handbuch
http://netcologne.dl.sourceforge.net/project/krename…
steht auf S. 10 zur Auswahlbox rechts neben Name: „Sie hat die Auswahl … einen benutzerspezifischen Namen zu verwenden“
Also trägst Du als benutzerspezifischen Namen einfach

mydatafile\_

ein und wählst als Suffix eine fortlaufende Nummerierung mit der passenden Stellenzahl (4-stellig?)
Wenn ich alles richtig verstanden habe erhältst Du so deine geforderten Namen und den Zähler: mydatafile_0001.dat, mydatafile_0002.dat, mydatafile_0003.dat usw. :wink:
Das ist in etwa das, was auf S. 12 unten als Beispiel mit dem Namen „wallpaper_##“ beschrieben wird.

Viele Grüße
Marvin

Korrektur u. pragmatische Lösung (hoffentlich)
Hallo crypto,
Natürlich habe ich Blödmann den entscheidenden Teil

Anzumerken wäre, dass der „mydatafile“ Teil verschieden lang sein kann

glatt überlesen, ist also nix mit meiner Lösung :frowning:
Da ich jetzt zu müde bin, schlage ich dir eine pragmatische Lösung vor:
Installiere „rename“, das sollte zum Standardrepertoir gehören und führe in deinem Verzeichnis folgenden Befehl aus:

rename 's/ \(.\*\)/\_/' \*

Mach das zur Sicherheit erstmal mit der Option -n, also

rename -n 's/ \(.\*\)/\_/' \*

die zeigt nur an, was passiert, führt es aber nicht aus.
So erhältst Du aus

alpha (asdd987).dat -\> alpha\_.dat
beta (asddg9874).dat -\> beta\_.dat
gamma (asg98746).dat -\> gamma\_.dat

Wenn ich mich nicht schon wieder verhauen habe, kannst Du das dann einfach durch krename drehen um den Zähler als Suffix hinzuzufügen und ich kann endlich ins Bett :wink:
Bis dann dann der nächste eine bessere Lösung vorschlägt.

Viele Grüße
Marvin

so vielleicht
Moin,

Ich finde in der Hilfe zu krename nichts über „suche bis zu
einem Zeichen ‚X‘“ oder „suche das Zeichen ‚X‘ und lasse den
Teil bis ‚Y‘ weg.“

vermutlich musst du in einer Hilfe zu „regulären Ausdrücken“ nachschlagen, in sowas z.B. ISBN-10: 3897217201 Buch anschauen (560 Seiten :wink: )

versuche mal im „suchen und ersetzen“-Dialog nach folgendem zu Suchen:
([a-z]*[0-9]*)
falls du auch Großbuchstaben hast bitte anpassen, vorne ist übrigens ein Leerzeichen. Das kannst du dann durch „nichts“ ersetzen. In der Zeile für den neuen Dateinamen „Muster“ schreibst du dann zB $#### rein was dann mydatafile1234 ergibt.

Ist es das was du wolltest?

HTH
J~

Hallo,

reguläre Ausdrücke sind toll, wenn man sie beherrscht. Weil ich aber die Regeln immer wieder vergesse, wenn ich zwei Wochen nicht damit gearbeitet habe, mache ich solche Sachen lieber mit awk und Funktionen wie printf, index und substr. Zum Beispiel:

ls | awk '{printf ("mv \"%s\" %s\_%04d\n",$0,$1,i);i++}'

Damit kann man erst mal überprüfen, ob das Ergebnis auch das ist, was man erwartet. Anschließend setzt man das Ganze in `` und führt es aus.

Gruß
Axurit.

Hallo,

Ich muss in einem ziemlich umfangreichen Ordner zigtausende
Dateien umbenennen.

Diese Dateien heissen alle der Form nach so:

mydatafile (unnecessarypart01234).dat

inklusive dem Leerzeichen, zwei runden Klammern und darin
einer Sortierungszahl, die mehrere Stellen haben kann.

Nun müssen diese Dateien so umbenannt werden, dass das
Leerzeichen, die runden Klammern sowie der Text dazwischen
entfällt und stattdessen ein Zähler eingefügt wird.

Also so:

mydatafile_0001.dat

Wie löse ich das mit krename?

Vielleicht kannst Du gprename oder pyrenamer einsetzen?
Damit sollte das mit anwenderfreundlicher Gui ziemlich einfach funktionieren.

Grüße
K.

aller guten Dinge sind 3
Hallo crypto,
nachts um 3 Uhr im Bett :wink: fiel mir ein, daß meine gestrige Bastelei auch nur dann funktioniert, wenn die „Vorsatznamen“, also dein mydatafile, alle verschieden sind, was wohl nicht der Fall sein wird.
Abhilfe wäre, zuerst in krename durchnummerieren und anschliessend durch ein leicht modifiziertes rename zu schicken -> unbefriedigend!
Deshalb habe ich rename und krename mal ganz weggelassen und mich auf die bash und sed beschränkt.

#!/bin/bash
**verz=/tmp/datei**
x=1
for fname in $verz/\*.dat
do
 nn=$(echo ${fname} | sed "s/ \(.\*\)/\_/")
 echo "${fname} -----\>" `printf "%s%05d.dat" $nn $x`
# mv -v "${fname}" `printf "%s%05d.dat" $nn $x`
 x=$(($x+1))
done

Die echo-Zeile ist zum Testen, ob alles gut aussieht, wenn ja, stattdessen die mv-Zeile nehmen.
Mit meinen Testdaten sieht der Ernstfall so aus:

„/tmp/datei/alpha (72172d).dat“ -\> „/tmp/datei/alpha\_00001.dat“
„/tmp/datei/alpha (mdsaawwfk7dfsk2172d).dat“ -\> „/tmp/datei/alpha\_00002.dat“
„/tmp/datei/alpha (mdsakj7dfsk2172d).dat“ -\> „/tmp/datei/alpha\_00003.dat“
„/tmp/datei/alpha (mist72172d).dat“ -\> „/tmp/datei/alpha\_00004.dat“
„/tmp/datei/beta (mdsaAaggGGwwfk7dfhsask2572d).dat“ -\> „/tmp/datei/beta\_00005.dat“
„/tmp/datei/beta (mdsaawwfk7dfhsask2172d).dat“ -\> „/tmp/datei/beta\_00006.dat“
„/tmp/datei/beta (mdsaawwfk7dfsk2172d).dat“ -\> „/tmp/datei/beta\_00007.dat“
„/tmp/datei/beta (mM+saAaggGGwwfk7dfhsask2572d).dat“ -\> „/tmp/datei/beta\_00008.dat“
„/tmp/datei/beta (xzygGGwwfk7dfhsask2g72d).dat“ -\> „/tmp/datei/beta\_00009.dat“
„/tmp/datei/epsilon (x767zyyckgGGwwfk7dfhsask2g72d).dat“ -\> „/tmp/datei/epsilon\_00010.dat“
„/tmp/datei/epsilon (x7zyyckk7dfhsask2g72d).dat“ -\> „/tmp/datei/epsilon\_00011.dat“
„/tmp/datei/epsilon (x7zyyckk7ggHHd).dat“ -\> „/tmp/datei/epsilon\_00012.dat“
„/tmp/datei/epsilon (xzyyckgGGwwfk7dfhsask2g72d).dat“ -\> „/tmp/datei/epsilon\_00013.dat“

Nicht sehr elegant, liesse sich mit awk sicher besser machen, aber es funktioniert (zumindest bei mir).
Es sei denn, Du möchtest für jeden „Vorsatznamen“ auch eine eigene Nummerierung, also sowas:
alpha_00001
alpha_00002
beta_ 00001
beta_ 00002
oder es sind noch andere Tücken in den Dateinamen, an die ich im Moment nicht denke…

Viele Grüße
Marvin

Hallo Marvin,

Du hast Dir für mein Problem die halbe Nacht um die Ohren geschlagen, da bin ich sehr erleichtert Dir sagen zu können, ich habe es mit Deinen Tipps hinbekommen :wink:

Hier die Step-by-Step-Lösung für krename:

-> Im Feld „Suchen und Ersetzen…“ wird ein regulärer Ausdruck eingetragen. Dieser lautet - wie Du schon genannt hast -:

^[(].*)

Ich habe das noch um den Anker ^ sowie um die Class [] für ein Leerzeichen vor der runden Klammer erweitert. Anker deswegen, weil häufig mehrere Leerzeichen im erwünschten Dateinamen vorkommen und es soll nur das Leerzeichen entfernt werden, das unmittelbar vor einer runden Klammer steht.

-> „Suchfeld enthält einen Regulären Ausdruck“ anticken.
-> „Ersetzen durch:“ (nichts eintragen, leer lassen).

Nun wird bereits der unerwünschte Name des Dateinamens weggelassen.

-> Ich habe jetzt noch im „Muster“-Feld ergänzt:

[$dirname]_$_###

wodurch der Verzeichnisname in den Dateinamen integriert wird sowie ein paar Underscores und eine dreistellige Durchnummerierung.

Perfekt!

Bei den umzubenennenden Dateien handelt es sich übrigens um Yamaha-Styles für meine MIDI-Orgel.

Ich konnte das alles mit krename durchführen.

Viele Grüße
Marvin

Mein herzliches Dankeschön geht auch an alle anderen, dir mir helfen wollten.

Viele Grüße,
Crypto.

Hallo,

mein Lösungsvorschlag ist, mmv zu verwenden.
Für jede Anzahl an Stellen für die Sortierungszahl gibt es einen eigenen Befehl und man muss mit der maximalen Anzahl an Stellen anfangen:

mmv '\* (\*[0-9][0-9][0-9][0-9][0-9]).dat' '#1\_#3#4#5#6#7.dat'
mmv '\* (\*[0-9][0-9][0-9][0-9]).dat' '#1\_#3#4#5#6.dat'
mmv '\* (\*[0-9][0-9][0-9]).dat' '#1\_#3#4#5.dat'
mmv '\* (\*[0-9][0-9]).dat' '#1\_#3#4.dat'
mmv '\* (\*[0-9]).dat' '#1\_#3.dat'

Wenn Du weißt, dass davor ein Buchstabe kommt, kannst Du auch den folgenden Code verwenden, der dies berücksichtigt:

mmv '\* (\*[a-zA-Z][0-9][0-9][0-9][0-9][0-9]).dat' '#1\_#4#5#6#7#8.dat'
mmv '\* (\*[a-zA-Z][0-9][0-9][0-9][0-9]).dat' '#1\_#4#5#6#7.dat'
mmv '\* (\*[a-zA-Z][0-9][0-9][0-9]).dat' '#1\_#4#5#6.dat'
mmv '\* (\*[a-zA-Z][0-9][0-9]).dat' '#1\_#4#5.dat'
mmv '\* (\*[a-zA-Z][0-9]).dat' '#1\_#4.dat'

Gruß
Diether