PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [bash-Programmierung]Dateinamen kuerzen



Raptor
10-03-2006, 15:45
Ich braeuchte bitte ein wenig Hilfe bei folgenden kleinen Programm:
Ich habe in einer Directory einen Haufen Files, die alle mit Zwei Ziffern beginnen.
Diese anfaenglichen Ziffern moechte ich eliminieren.
Ich habe dazu folgendes Programm gescriptet
for i in `ls`
do
mv $("$i") `echo $("$i") | tail --bytes=$((`echo $("$i") | wc --chars` -2))`
done
Es funktioniert noch nicht ganz, weil es dadurch Probleme gibt, dass die bash Filenames, die einen Blank enthalten in mehrere Zeichen aufbricht.
Hier mal ein log:
UniX:~/test/testarea/mukke$ ls
01 - Anthem Part Two.mp3 01 - Blues for Shorty Bill.mp3 01 - Dumpweed.mp3
01 - Avril Lavigne - Sk8er.mp3 01 - Carousel.mp3 01 - Ensiferum - Intro.mp3
UniX:~/test/testarea/mukke$ sh ../elimFront.sh
../elimFront.sh: line 4: 01: command not found
../elimFront.sh: command substitution: line 4: unexpected EOF while looking for matching `)'
../elimFront.sh: command substitution: line 5: syntax error: unexpected end of file
../elimFront.sh: line 4: 01: command not found
../elimFront.sh: command substitution: line 4: syntax error near unexpected token `)'
../elimFront.sh: command substitution: line 4: ` -2))'
mv: missing destination file operand after `echo | wc --chars'
Try `mv --help' for more information.
../elimFront.sh: line 4: -: command not found
../elimFront.sh: command substitution: line 4: unexpected EOF while looking for matching `)'
../elimFront.sh: command substitution: line 5: syntax error: unexpected end of file
../elimFront.sh: line 4: -: command not found
../elimFront.sh: command substitution: line 4: syntax error near unexpected token `)'
../elimFront.sh: command substitution: line 4: ` -2))'
mv: missing destination file operand after `echo | wc --chars'
[und so weiter]
....


Any help?

klaus_harrer
10-03-2006, 16:43
Hallo

Vielicht sollte man einen Zwischenschritt einlegen(bsp):


echo "01 - Anthem Part Two.mp3" | sed 's/\ /_/g '


kann man im nach hinein wieder rückgängig machen.

MfG
klaus_harrer

Raptor
10-03-2006, 17:22
Das hilft mir aber auch nicht wirklich weiter, weil das urspruengliche Problem ja bestehen bleibt,
naemlich dass ich mindestens einmal den alten Dateinamen mit dem Blanks benutzen muss, um ihn dann zu aendern und die blanks mittels sed zu eliminieren.

Ich frage mich eigentlich, warum die bash meine Strings(die ja blanks enthalten) in mehrere String aurbricht -- genau aus dem Grund habe ich ja $("$i") geschrieben anstatt nur $i

Romanday
10-03-2006, 17:51
Das hilft mir aber auch nicht wirklich weiter, weil das urspruengliche Problem ja bestehen bleibt,
naemlich dass ich mindestens einmal den alten Dateinamen mit dem Blanks benutzen muss, um ihn dann zu aendern und die blanks mittels sed zu eliminieren.

Ich frage mich eigentlich, warum die bash meine Strings(die ja blanks enthalten) in mehrere String aurbricht -- genau aus dem Grund habe ich ja $("$i") geschrieben anstatt nur $i

Du Shell ist für solche Spielchen ungeeignet, das merkst du
spätestes, wenn Du mal alle Sonderzeichen in einem Dateinamen
verwendest.

-> PHP, Perl etc. benutzen.

Raptor
10-03-2006, 18:07
Aber ist es nicht moeglich, dass die Dateinamen ganz stumpf weitergegeben werde, ohne das irgendetwas darin interpretiert oder veraendert wird? Genau zu dem Zweck setzt man Variablen doch in Anfuehrungszeichen

Romanday
10-03-2006, 18:11
Aber ist es nicht moeglich, dass die Dateinamen ganz stumpf weitergegeben werde, ohne das irgendetwas darin interpretiert oder veraendert wird? Genau zu dem Zweck setzt man Variablen doch in Anfuehrungszeichen

Warum glaubst Du mir nicht, das dein Weg in eine Sackgasse führt?:D

Raptor
10-03-2006, 18:22
Weil ich irgendwie nicht recht glauben kann, dass die bash schon an so einem zweizeiler scheitern soll.
Ich habe so gut wie keine Ahnung von bash-Programmierung, deswegen vermute ich einen ganz trivialen Fehler.

TheReaper
10-03-2006, 20:56
Simple Lösung:


#!/bin/bash

for i in *
do
mv "$i" "`echo $i | sed 's/^[0-9][0-9] - //'`"
done

Das Problem lag bei dir am
for i in `ls`weil dadurch eben die Dateinamen aufgesplittet werden. Die RegEx haut dir die Zahl und den Bindestrich weg.

lg

Raptor
10-03-2006, 23:17
Sehr gut :)
Danke!

Romanday
11-03-2006, 07:33
Weil ich irgendwie nicht recht glauben kann, dass die bash schon an so einem zweizeiler scheitern soll.
Ich habe so gut wie keine Ahnung von bash-Programmierung, deswegen vermute ich einen ganz trivialen Fehler.

Da gebe ich dir Recht, aber angenommen Du möchtest mit deinem
Script kompatibel sein, und auch z. B. auf Windows Ordern zugreifen,
gibt es Probleme.

Kannst Du sicherstellen, das jeder Dateiname keine Sonderzeichen ||
Whitespaces enthält? Dann gibt es keine Probleme.

Für die Shell sind viele Zeichen halt Steuerzeichen.

siehe:
www.linuxfibel.de

Möchte man unabhängig vom OS so etwas lösen sind andere Scriptsprachen
die bessere und schnellere Wahl und sparen Lebenzeit.

(AWK als weitere Alternative hatte ich noch vergessen.)