PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : files per script umbennen?



hmikux
05-02-2011, 21:20
Hallo Leute,
würde gerne mehrere files umbenennen. Leider läuft mein script im Moment noch auf einen Fehler.

Hier mehr Details - umbenennen von files:
Nachname_Vorname_12343_1500.mp4
Nachname_Vorname_12a_1500.mp4
Nachname_Vorname_34gfgtg67_1500.mp4
Nachname_Vorname_45tgh56_1500.mp4

nach:
12343.mp4
12a.mp4
34gfgtg67.mp4
45tgh56.mp4

Hier mein script:

#!/bin/sh
for i in Nachname_Vorname_*.mp4; do mv "$i" "${i#Nachname_Vorname_}"; done
for i in *_1500.mp4; do mv "$i" "${i/_1500.mp4}".mp4; done
exit 0

Also wenn ich die Kommandos separate in der shell ausführe, erhalte ich das erwünschte Ergebnis. Wenn ich jedoch das ganze script ablaufen lassen, passiert folgendes:

linux$ ./script.sh
./script.sh: 4: Bad substitution
linux$ ls -l
insgesamt 4
-rw-r--r-- 1 linux linux 0 2011-02-05 22:10 12343_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-05 22:11 12a_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-05 22:11 34gfgtg67_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-05 22:11 45tgh56_1500.mp4

Bin dankbar für jeden Tip.

John W
05-02-2011, 23:58
Warum nimmst du nicht rename? Mit der Option -n kannst du das Verhalten simulieren, sollte aber so richtig sein:


rename 's/(Vorname_Nachname_)?(.+)(_1500).mp4/$2.mp4/' Vorname_Nachname_*.mp4

hmikux
06-02-2011, 13:24
Hi John W,

Befehl rename steht mir leider nicht zur Verfügung. Das script soll auf einer RouterPlatform mit OpenWrt laufen. Dort ist busybox-sh installiert und die Kommandos sind doch etwas limitiert.

John W
06-02-2011, 14:24
Das könnte knifflig werden, weil du keine Bash hast - ich hätte dann noch 2 Alternativen, einmal mit sed und einmal mit awk:


for i in Nachname_Vorname_*.mp4; do mv "$i" "`echo "$i" | sed -r 's#(Nachname_Vorname_)?(.+)(_1500)?.mp4#\2.mp4#'`"; done



for i in Nachname_Vorname_*.mp4; do mv "$i" "`echo "$i" | awk '{print gensub(/^Nachname_Vorname_/, "", "g", gensub(/_1500.mp4$/, ".mp4", "g"))}'`"; done

hmikux
06-02-2011, 19:23
John W,
danke fuer deine Hilfe. Die awk Variante funktioniert nicht:

linux$ ls -l
insgesamt 4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_12343_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_12a_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_34gfgtg67_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_45tgh56_1500.mp4

linux$ for i in Nachname_Vorname_*.mp4; do mv "$i" "`echo "$i" | awk '{print gensub(/^Nachname_Vorname_/, "", "g", gensub(/_1500.mp4$/, ".mp4", "g"))}'`"; done

awk: line 2: function gensub never defined
awk: line 2: function gensub never defined
mv: Verschieben von „Nachname_Vorname_12343_1500.mp4“ nach „“ nicht möglich: No such file or directory
awk: line 2: function gensub never defined
awk: line 2: function gensub never defined
mv: Verschieben von „Nachname_Vorname_12a_1500.mp4“ nach „“ nicht möglich: No such file or directory
awk: line 2: function gensub never defined
awk: line 2: function gensub never defined
mv: Verschieben von „Nachname_Vorname_34gfgtg67_1500.mp4“ nach „“ nicht möglich: No such file or directory
awk: line 2: function gensub never defined
awk: line 2: function gensub never defined
mv: Verschieben von „Nachname_Vorname_45tgh56_1500.mp4“ nach „“ nicht möglich: No such file or directory


Die sed Variante sieht besser aus, aber noch nicht ganz das, was ich als Endresultat wollte:

linux$ ls -l
insgesamt 4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_12343_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_12a_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_34gfgtg67_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_45tgh56_1500.mp4

linux$ for i in Nachname_Vorname_*.mp4; do mv "$i" "`echo "$i" | sed -r 's#(Nachname_Vorname_)?(.+)(_1500)?.mp4#\2.mp4#'`"; done

linux$ ls -l
insgesamt 4
-rw-r--r-- 1 hrvoje hrvoje 0 2011-02-05 22:21 12343_1500.mp4
-rw-r--r-- 1 hrvoje hrvoje 0 2011-02-05 22:21 12a_1500.mp4
-rw-r--r-- 1 hrvoje hrvoje 0 2011-02-05 22:21 34gfgtg67_1500.mp4
-rw-r--r-- 1 hrvoje hrvoje 0 2011-02-05 22:21 45tgh56_1500.mp4

Ich haette auch gerne das '_1500' aus dem filenamen gelöscht. Werde mich noch mal bei den manpages von sed umschauen.

Aber wenn ich ehrlich bin, sieht doch die von mir erstgenannte Variante einfacher aus. Es gibt mal wieder verschiedene Wege zum Ziel.

Danke & Schönen Abend noch.

John W
06-02-2011, 19:48
Mein Fehler, sed ist gerne "gierig":


for i in Nachname_Vorname_*.mp4; do mv "$i" "`echo "$i" | sed -r 's#(Nachname_Vorname_)?(.+)_1500.mp4#\2.mp4#'`"; done

Damit ist der _1500-Teil nicht mehr optional, sondern muss vorhanden sein, damit etwas ersetzt wird.

hmikux
06-02-2011, 19:54
Hey. Super. Hat funktioniert.

linux$ ls -l
insgesamt 4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_12343_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_12a_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_34gfgtg67_1500.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 Nachname_Vorname_45tgh56_1500.mp4

linux$ for i in Nachname_Vorname_*.mp4; do mv "$i" "`echo "$i" | sed -r 's#(Nachname_Vorname_)?(.+)_1500.mp4#\2.mp4#'`"; done

linux$ ls -l
insgesamt 4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 12343.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 12a.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 34gfgtg67.mp4
-rw-r--r-- 1 linux linux 0 2011-02-06 20:15 45tgh56.mp4

Werde dies so in mein script einbauen!

VIELEN DANK!