Shell: wiedermal ein Problem mit Leerzeichen



  • Ich hab ein Shellscript, in dem sowas drin steht:

    for foo in ../*; do irgendwasstunmit $foo; done
    

    Das entscheidende ist hierbei eigentlich das ../*
    Ich will statt allen Dateien im Mutterverzeichnis in alphabetischer Reihenfolge die Dateien in chronologischer Reihenfolge haben.

    Sobald ich aber irgendwas in der Form

    for foo in `ls -td ../*`; do irgendwasstunmit $foo; done
    

    verwende, geht nichts mehr, da die Dateinamen Leerzeichen enthalten.

    Wisst ihr, wie ich das machen kann?



  • einfach das $foo in "" setzen

    for foo in `ls -td ../*`; do irgendwasstunmit "$foo"; done
    


  • Das hatte ich schon. Leider funktioniert es trotzdem nicht.

    Also das Script fuehre ich in einem Verzeichnis "playlists" aus. Es erstellt mir dann fuer die ganzen Alben im uebergeordneten Verzeichnis Playlists:

    for album in ../*; do echo "bearbeite $album..."; albumname=`basename "$album"`; find "$album" -name *.mp3|sort > "$albumname"
    .m3u; done
    

    Wenn ich das wie folgt aendere, funktioniert es nicht mehr:

    for album in `ls -1td ../*`; do echo "bearbeite $album..."; albumname=`basename "$album"`; find "$album" -name *.mp3|sort > "$albumname"
    .m3u; done
    


  • Hi,

    ist das Problem noch aktuell?

    Wie wäre es, wenn Du es so machst:

    ls ../*.mp3 | while read ALBUM
    do
    
    echo " Bearbeite $ALBUM"
    ALBUMNAME=`basename $ALBUM`
    
    ...wasauchimmer...
    
    done
    

    Du kannst das ls / ll / von mir aus auch find - Ergebnis vor dem while
    ja anpassen wie Du möchtest. Du kannst das Ergebnis auch in eine Datei
    umleiten, sortieren und vor dem while ein cat auf den Dateinamen machen.



  • Danke fuer die Anwort.

    Ich habe es jetzt syntaktisch korrekt hinbekommen, habe allerdings herausgefunden, dass es so nicht funktioniert. Die letzte Zugriffszeit von Dateien wird anscheinend "nur" sekundengenau gespeichert und das Script laeuft nur wenige Sekunden.

    Mein Ziel, die Playlists in der gleichen chronologischen Reihenfolge, wie die eigentlichen Alben verwenden zu koennen, ist so wahrscheinlich nicht erreichbar.
    Ich koennte natuerlich ein "sleep 1" reinsetzen, das ist aber recht witzlos, finde ich.

    Ich erstelle jetzt allerdings nur noch eine Playlist, wenn noch keine vorhanden ist.
    Das erlaubt mir dann zwar nicht rueckwirkend, die Playlists in die chronologische Reihenfolge zu bekommen, fuer zukuenftige funktioniert es aber. Halbwegs zufriedenstellend.

    #!/bin/bash
    
    /bin/ls -1d ../*| while read album
    do
    
            albumname=`basename "$album"`
            if ! [[ -e "$albumname".m3u ]];  then
                    echo "Bearbeite $album"
                    find "$album" -name *.mp3|sort > "$albumname".m3u;
            fi
    
    done
    

    Wenn ihr ne Idee habt, wie sich die chronologische Reihenfolge "uebernehmen" laesst, waere ich euch dafuer natuerlich dankbar.



  • ...wenn Du mir etwas genaueres über die Datei/Verzeichnis-Struktur schreiben kannst bzw. wie die Datei/Verzeichnisnamen heissen...

    So kann ich da leider keinen Anpack finden...



  • ok, die Verzeichnisstruktur ist recht einfach:
    in einem Verzeichnis "Musik" befinden sich Verzeichnisse(fuer jedes Album eines), innerhalb der Verzeichnisse sind die mp3s (+ evtl. noch ein paar andere Dateien). Unterverzeichnisse gibt es keine. Ebenfalls im Verzeichnis "Musik" ist das Verzeichnis "playlists", ich welchesdie Playlists der Alben sollen.

    Das eine Album habe ich z.B. im Januar '04 bekommen, ein anderes im Oktober '03, usw.

    Ich haette die Playlists nun eben gerne in dieser Reihenfolge. (also wie "ls -t")



  • Du kannst ja mit ls -rt die Reihenfolge so einstellen, das die Verzeichnisse
    nach Datum sortiert, aktuellstes zuletzt, angezeigt werden.

    Ansonsten sortier doch in einer Datei so wie Du es brauchst.

    Entweder nach Erstelldatum des Verzeichnisses oder alphanumerisch.
    Wäre es eventuell Sinnvoll die Verzeichnisse so umzubenennen,
    dass sie einen zeitstempel vorne und einen Namen Deiner Wahl dahinter haben?

    z.B.

    jjmmtthhmmss_Album_04.....

    und im Script haust Du mit dem sed die Unterstriche raus und der awk
    überliest Dir den Zeitstempel.

    ..nur so eine Idee...



  • Deine Vorschlaege kann ich leider nicht umsetzen, da ich die Playlists in ein closed-source-Programm laden muss, dass mit all dem nicht umgehen koennte.

    Ist aber eigentlich ganz ok, so wie es jetzt laeuft.

    Danke & Gruss.


Anmelden zum Antworten