Problem mit Rekursion in Bash / Funktioniert das überhaupt?

S

sramko

Grünschnabel
Hallo Allerseits,

ich versuche gerade ein kleines Shell skript zu schreiben, welches bei einem gegebenen Verzeichnis alle darunter liegenden Dateien und Ordner durchläuft und ein paar Informationen ausspuckt. Allerdings gibt es zwei bedingungen:
  1. Es müssen zunächst die Dateien eines Ordners und erst danach die Unterordner behandelt werden
  2. Alles muss in alphabetischer Reihenfolge durchlaufen werden.

Nach einigen Versuchen, WebSearch und ManPages lesen kam ich zu dem Ergebiss, dass "find" diese Aufgabe nicht bewältigen kann.
hier mein ansatz als bash-Script:
Code:
iteration()  
{
    echo $1 $2;
    local dr=$1;
    local i=;
    local j=;
    local nr=$2;
    
    for i in $(ls -1 -q "$dr") ; do 
	if test -f $i ; then
	    echo f\;$nr\;$i\;$dr/$i ;
	fi
    done;
    
    for j in $(ls -1 -q "$dr") ; do 
	if test -d $j ; then
	    echo d\;$nr\;$j\;$dr/$j ;
	    iteration  $dr/$j $[$nr+1]; #hier ist das Problem
	fi
    done;   
}

Der erste durchlauf klappt super. Aber die Iterration klappt nicht. Wie ihr seht, hab ich es mit "local" Variablen versucht, ohne genaues Wissen darüber, wie das in Bash funktioniert. In Java, Perl, Python, PHP,.... würde der Code ja prima funktionieren, aber unter Bash bekomme ich ihn nicht zum laufen.

Nun die Frage: kann mir jemand ein Beispiel für rekursieve Bash-Programmierung schicken oder mir zumidest zu verstehen geben, dass Rekursion in Bash nicht funktioniert?

Danke,

Lyrik
 
Hi,

Rekursion funktioniert prima, hab ich zum Spass grad mal getestet indem ich die fibonacci sequence rekursiv in der bash geschrieben hab. ;)

Was ist denn die Fehlermeldung? Edit: Und der erste Aufruf waere ja vielleicht auch interessant.

Edit2:
Ah, habe gerade ein wenig mit deinem Code rumgespielt, die Tests sind das Problem. Du fuehrst die Tests im falschen Ordner aus, bzw. musst noch den Pfad davor stellen. Hier mal eine leicht angepasste Version deines Skripts:

Code:
iteration()
{
    echo $1 $2
    dr=$1
    nr=$2

    for i in $(ls -1 -q "$dr"); do
        if [ -f $dr/$i ]; then
            echo "f;$nr;$i;$dr/$i"
        fi
    done

    for j in $(ls -1 -q "$dr"); do
        if [ -d $dr/$j ]; then
            echo "d;$nr;$j;$dr/$j"
            newdir="$dr/$j"
            newnr=$((nr + 1))
            iteration $newdir $newnr
        fi
    done
}

mfg,
bytepool
 
Zuletzt bearbeitet:
Fehler gefunden: ich hab jeweils in der if-Abfrage versäumt, den gesamten Pfad mit anzugeben.

Wer's braut: hier nochmal der korrigierte Code

Code:
iteration()  
{
    #echo $1 $2;
    local dr=$1;
    local i=;
    local j=;
    local nr=$2;
    
    #echo dr $dr, nr $nr,
    for i in $(ls -1 -q "$dr") ; do 
	if test -f "$dr/$i" ; then
	#    echo f
	    echo f\;$nr\;$i\;$dr/$i ;
	fi
    done;
    
    for j in $(ls -1 -q "$dr") ; do 
	if test -d "$dr/$j" ; then
	 #   echo d
	    echo d\;$nr\;$j\;$dr/$j ;
	    iteration  "$dr/$j" $[$nr+1];
	fi
    done;   
}


iteration $(pwd)
 
Zuletzt bearbeitet:

Ähnliche Themen

Switche abfragen über Script

NAS-Drive Mount in Bash-Script über crontab

Verschlüsseltes Backup-Script mit rsync

script sshpass

ip6tables Problem

Zurück
Oben