datei auslesen und ordner umbenennen - bash unter linux

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von wolf_1313, 04.01.2010.

  1. #1 wolf_1313, 04.01.2010
    Zuletzt bearbeitet: 04.01.2010
    wolf_1313

    wolf_1313 Jungspund

    Dabei seit:
    04.01.2010
    Beiträge:
    12
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Gast1

    Gast1 Guest

    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).
     
  4. #3 marcellus, 04.01.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    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.


    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"
     
  5. #4 wolf_1313, 04.01.2010
    wolf_1313

    wolf_1313 Jungspund

    Dabei seit:
    04.01.2010
    Beiträge:
    12
    Zustimmungen:
    0
    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.
     
  6. #5 marcellus, 04.01.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    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.
     
  7. #6 bytepool, 05.01.2010
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    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
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

datei auslesen und ordner umbenennen - bash unter linux

Die Seite wird geladen...

datei auslesen und ordner umbenennen - bash unter linux - Ähnliche Themen

  1. Datei auslesen und fund per MAil versenden.

    Datei auslesen und fund per MAil versenden.: Hallo folgendes Script habe ich zur Zeit in Arbeit. Und zwar führe ich über "at" ein kleines Script aus was in einem Logfile nach bestimmten...
  2. Dateien auslesen und Daten systematisch angeordnet in Datei ausgeben

    Dateien auslesen und Daten systematisch angeordnet in Datei ausgeben: Guten Abend, ich hätte da mal eine Frage. Bin mir recht sicher, dass es in der Shell funktionieren sollte, aber kenne mich damit kaum aus....
  3. ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

    ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern: Hallo Leute, heute brauche ich mal einen dringenden Rat von Euch. Ich habe hier etwas mehr als 1200 PDF-Dateien (Text), die jeweils ein...
  4. Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

    Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql: Hallo Eventuell kann mir jemand bei meinem Problem helfen. Ich habe mich irgendwie total verrannt und komme nicht weiter. Die folgende...
  5. Datei auslesen per Python (WLST)

    Datei auslesen per Python (WLST): Guten Abend, ich weiß nicht ob ich das hier posten kann - da WLST (WebLogic Scripting Tool) ja jetzt nicht so dazu gehört... Aber vielleicht...