datei auslesen und ordner umbenennen - bash unter linux

W

wolf_1313

Jungspund
Hallo,
ich bastel grade an einem bash skript, dass mir id3tags von mp3-Dateien ausliest und dann den ordner im format "artist - album" umbenennt.

das auslesen hab ich hinbekommen:
Code:
a=`id3v2 -l *.mp3 | grep 'performer' | cut -d\  -f 4  > ./tmp.test; cat ./tmp.test | split -l 1; cat xaa`
b=`id3v2 -l *.mp3 | grep 'Album' | cut -d\  -f 4 >./tmp.test;cat ./tmp.test | split -l 1; cat xaa`
echo "$a - $b"

Ich habe da mehrere ordner, die etwa so aussehen:
abc/x/lklkfj.mp3
abc/x/jnfk.mp3

abc/y/fljkgpodj.mp3
abc/y/gfknfg.mp3

abc/z/jhbjb.mp3
abc/z/ghgh.mp3

ich würde gerne im ordner abc/ starten und dann nacheinander in jeden ordner wechseln, den string auslesen und dann den ordner umbenennen.
Ich wäre dankbar über einen hinweis wie ich das realisieren kann.

for i in `ls`
macht probleme wegen vielen leerstellen in den ordnernamen
 
Zuletzt bearbeitet:
Dürfte ein klassischer Fall für "find" sein.

P.S.

Ein "for i in ls" sollte man nie verwenden (es ist AFAIK auch unnötig, denn for kann bestens mit wildcards umgehen).
 
Code:
a=`id3v2 -l *.mp3 | grep 'performer' | cut -d\  -f 4  > ./tmp.test; cat ./tmp.test | split -l 1; cat xaa`
b=`id3v2 -l *.mp3 | grep 'Album' | cut -d\  -f 4 >./tmp.test;cat ./tmp.test | split -l 1; cat xaa`
echo "$a - $b"

Das ist ja bissi aufwändig, obwohl ich von shell scripts wenig bis gar keine ahnung hab, denk ich, dass du mit

Code:
#!/bin/bash

IFS="
"
for i in *\.mp3
do
           performer=`id3v2 -l $i | grep 'TPE1'`
           #schreibt die zeile in $performer
           performer=${performer:37 }
           #löscht die ersten 37 zeichen aus dem string

           album=`id3v2 -l $i | grep 'TALB'`
           album=${album:31 }
             echo album is \"$album\", by \"$performer\"
done
mehr spaß haben wirst.

for i in `ls`
macht probleme wegen vielen leerstellen in den ordnernamen


dafür setzt man den internal file operator (IFS) auf '\n'

Ich versteh trotzdem nicht was genau du vor hast.

Aber ich nehm an du suchst nach "mv"
 
hallo,
ich habe es mittlerweile hinbekommen, trotzdem danke für die hilfe.

Code:
#/bin/sh
for i in ./*	
do
if test -d "$i"
then
	a="`id3v2 -l "$i"/*.mp3 | grep 'performer' | cut -d\  -f 4,5,6,7,8,9  > ./tmp.test; cat ./tmp.test | split -l 1; cat xaa`"
	b="`id3v2 -l "$i"/*.mp3 | grep 'Album' | cut -d\  -f 4,5,6,7,8,9 >./tmp.test;cat ./tmp.test | split -l 1; cat xaa`"
	echo "$a - $b"
	string="$a - $b" 
	mv "$i" "$string"
fi
done

ich bin mir sicher das es viel kürzer geht (aber nicht mit meinem derzeitigen wissenstand).
Ich werde den Tipp mit Arrays gleich mal ausprobieren.
 
Du könntest das ganze noch etwas eleganter machen, indem du
Code:
for i in ./*	
do
if test -d "$i"
then
mit
Code:
 for i in $(find -type d)
ersetzten würdest, außerdem kannst du mit find auch befehle ausführen.
 
Hi,

Du könntest das ganze noch etwas eleganter machen, indem du
Code:
for i in ./*	
do
if test -d "$i"
then
mit
Code:
 for i in $(find -type d)
ersetzten würdest, außerdem kannst du mit find auch befehle ausführen.
deine Vorstellung von Eleganz deckt sich nicht mit meiner. ;)
Damit startest du unnoetigerweise eine Subshell, was deutlich langsamer ist, davon abgesehen dass find sowieso recht langsam ist.

Mein Aesthetikgefuehl wuerde mich eher zu folgender Aenderung veranlassen, aber das ist wirklich Kosmetik:
Code:
for i in *; do
    if [ -d "$i" ]; then
       echo $i
    fi
done

@wolf_1313
Beim ueberfliegen deiner Loesung faellt mir nur auf, dass ich das schreiben in die temp Datei einfach weglassen wuerde, das verschwendet doch nur Ressourcen und ist ueberfluessig. Dann kann man sich auch die ganzen cat Aufrufe sparen.

mfg,
bytepool
 

Ähnliche Themen

skript zum löschen doppelter dateien

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Prozess aus eigenem Init script wird gekillt

Umlaute und so umbenennen... - ntfs probleme?

Server-Monitoring mit RRDTool

Zurück
Oben