Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
BASH: Alle Verzeichnisse in einem Verzeichnis finden, auch mit Leerzeichen

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
domseichter



Anmeldungsdatum: 11.02.2002
Beiträge: 57
Wohnort: Laufen

BeitragVerfasst am: 22. Jul 2003 9:07   Titel: BASH: Alle Verzeichnisse in einem Verzeichnis finden, auch mit Leerzeichen

Hallo,

Ich habe folgendes Problem in einem bash script. Ich muss in einem for loop alle Verzeichnisse im Aktuellen Verzeichnis (inklusive derer Unterverzeichnisse) durchgehen. Ich möchte das in $i immer ein Verzeichnis wieder findet. Beim ersten durchlauf /home/dir1, beim 2. durchlauf /home/dir2 und dann /home/dir2/subdir1 usw. . Das ganze klappt auch ganz gut, solange die Verzeichnisnamen keine Leerzeichen enthalten. Ich habe es schon mit Anführungszeichen an verschiedenen stellen probiert, aber ohne Erfolg (den kompletten find Befehl in Anführungszeichen oder $i bein echo Befehl).

code:

for i in $(find $PWD -type d | sort );
do
echo $i # in wirklich wird mit i jetzt etwas sinnvolles gemacht
done;



Ich hoffe ihr habt eine Idee und könnt mir weiterhelfen.

CU Dom
_________________
<!--http--><a href="http://www.kbarcode.net" target="_blank">kbarcode.net</a><!--url--> - <!--http--><a href="http://www.krename.net" target="_blank">krename.net</a><!--url-->
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

Jochen
Gast





BeitragVerfasst am: 22. Jul 2003 10:41   Titel: Re: BASH: Alle Verzeichnisse in einem Verzeichnis finden, auch mit Leerzeichen

Hi!

Dein Problem liegt darin, dass die Shell zuerst die Liste der Verzeichnisse aufbaut, sie für die for-Schleife einsetzt und dann die Liste anhand der Blanks in einzelne Elemente zerlegt. Alternativen wären

  • while statt for verwenden
    find . -depth -type d -print | sort | while read DIR ; do echo "$DIR" ; done

  • über die Variable IFS das Zerlegen anhand der Blanks unterdrücken
    code:
    OIFS="$IFS"
    IFS=""
    for DIR in $(find . -type d -depth -print | sort) ; do
    echo "$DIR"
    done
    IFS="$OIFS"



    Beide Lösungen haben auch Nachteile. Die while-Schleife wird in der bash scheinbar durch eine Subshell abgearbeitet. Wenn man dort Variablen setzt, sind sie nach der while-Schleife wieder weg. In der zweiten Lösung wird IFS verändert, was zu Nebeneffekten bei folgenden Kommandos führen kann. Möglicherweise hilft es, wenn man IFS direkt im Schleifenkörper wieder restauriert und ncht erst am Ende der Schleife, wie im Beispiel oben. Das habe ich aber nicht ausprobiert.

    Noch eine Anmerkung: Verwende einfach "." statt "$PWD". Das Ergebnis ist genau das gleiche, aber die Shell hat weniger zu tun.

    Jochen
  •  

    domseichter



    Anmeldungsdatum: 11.02.2002
    Beiträge: 57
    Wohnort: Laufen

    BeitragVerfasst am: 22. Jul 2003 11:05   Titel: Re: BASH: Alle Verzeichnisse in einem Verzeichnis finden, auch mit Leerzeichen

    Hallo,

    Vielen Dank, Jochen, Du hast mir sehr geholfen. Mein script läuft jetzt. Ich habe mir nämlich ein script gebastelt, dass meine komplette Mp3 Samlung in /home/dominik/Musik durchgeht und in für jedes Verzeichnis eine Playlist Datei (.m3u) erstellt. Jetzt kann ich meine Sammlung einfach in Juk importieren (wird Teil von KDE 3.2 sein) und hab schon alles nach Album und Interpret sortiert, da Juk die Playlist Dateien mit einliest.
    Das fertige Script sieht so aus, vieleicht hat ja noch jemand Verbesserungs Vorschläge:
    code:

    #!/bin/bash

    # Licensed under the GPL

    echo "These script walks through a recursive directory tree"
    echo "and creates a playlist m3u file for all mp3, ogg or wav"
    echo "files it finds."
    echo "(c) 2003 Dominik Seichter <domseichter@web.de>"

    find $PWD -depth -type d -print | sort | while read DIR ;
    do
    pushd "$DIR"
    listname=$(echo "$DIR" | awk -F "/" '{print $NF }' ).m3u;
    find ./ -type f -maxdepth 1 | sed "s/.\///" | egrep -i -e "(.ogg|.mp3|.wav)" | sort | cat > ./"$listname";

    # if playlist is empty, delete it
    if [ -f "$listname" ];
    then
    if [ ! -s "$listname" ];
    then
    echo "Removing $listname again, because it is emtpy";
    rm "$listname";
    fi
    fi
    popd
    done



    CU Dom
    _________________
    <!--http--><a href="http://www.kbarcode.net" target="_blank">kbarcode.net</a><!--url--> - <!--http--><a href="http://www.krename.net" target="_blank">krename.net</a><!--url-->
     
    Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

    Jochen
    Gast





    BeitragVerfasst am: 22. Jul 2003 14:19   Titel: Re: BASH: Alle Verzeichnisse in einem Verzeichnis finden, auch mit Leerzeichen

  • Aus
    listname=$(echo "$DIR" | awk -F "/" '{print $NF }' ).m3u;
    würde ich
    listname=$(basename "$DIR").m3u
    machen. Das ist einfach lesbarer.

  • Das "| cat" in der Folgezeile bitte ersatzlos streichen. Google mal nach "useless use of cat award" .

  • Du treibst mit find, sed und egrep viel Aufwand. Wenn Du statt dessen der Shell sagst, sie soll bei Dateinamensauflösung case-insensitive arbeiten, geht das auch mit einem simplen ls. Ein
    shopt -s nocaseglob
    kommt vor die Schleife und statt des find/sed/egreps reicht dann ein
    ls *.{mp3,ogg,wav}
    Mit dem vorherigen Tipp kombiniert ergibt sich
    ls *.{mp3,ogg,wav} | sort > "$listname"
    als Ersatz für
    find ./ -type f -maxdepth 1 | sed "s/.\///" | egrep -i -e "(.ogg|.mp3|.wav)" | sort | cat > ./"$listname";
    Ein Unterschied ergibt sich nur in Spezialfällen, nämlich bei Directories, die auf .mp3/.wav/.ogg enden, und bei Sounddateien, die mit einem Punkt beginnen. Den zweiten Fall kann man mit
    shopt -s dotglob
    (ebenfalls nur einmal vor der Schleife) beheben.

    Jochen
  •  

    domseichter



    Anmeldungsdatum: 11.02.2002
    Beiträge: 57
    Wohnort: Laufen

    BeitragVerfasst am: 23. Jul 2003 11:35   Titel: Re: BASH: Alle Verzeichnisse in einem Verzeichnis finden, auch mit Leerzeichen

    Hallo,

    Den Befehl shopt kannte ich gar nicht, ist aber sehr nützlich. Vielen Dank für Deine neuen Tips, die machen mein Script um einiges einfach (obwohl ich so Stolz war find, sed, grep, awk und cat in einer Zeile untergebracht zu haben ).

    CU Dom
    _________________
    <!--http--><a href="http://www.kbarcode.net" target="_blank">kbarcode.net</a><!--url--> - <!--http--><a href="http://www.krename.net" target="_blank">krename.net</a><!--url-->
     
    Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

    Beiträge vom vorherigen Thema anzeigen:   
         Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
    Seite 1 von 1

     
    Gehen Sie zu:  

    Powered by phpBB © phpBB Group
    pro_linux Theme © 2004 by Mandaxy