rekursives Zählen von Dateien und Verzeichnissen

rekursives Zählen von Dateien und Verzeichnissen

Ich brauche hierzu etwas Hilfe:

Nehmen wir an, ich befinde mich in einem Verzeichnis und in diesem Verzeichnis gibt es andere Verzeichnisse und Dateien usw.

Ich möchte eine rekursive Funktion verwenden, um alle darin und auch im Unterverzeichnis vorhandenen Dateien und Verzeichnisse zu zählen.

Ich weiß, dass ich das Problem lösen kann, indem ich wc ... grep oder find verwende, aber ich versuche hier wirklich, meine erste rekursive Funktion zu verwenden.

Das habe ich bisher gemacht, aber es funktioniert nicht richtig

    counting(){


    for i in $(ls -a $1)
    do
          if [ -d $1/$i ];then
          let d++
          cd $1/$i       
          counting $i
          cd ..
          elif [ -f $1/$i ];then
          let f++
          fi
    done

  }

counting $1
echo "number of files = $f ; number of directories = $d"

Antwort1

Hier sind einige Dinge, die Sie verbessern können (ohne Anspruch auf Vollständigkeit):

  1. NiemalsAnalysieren Sie die Ausgabe von ls.
    Ihr Skript wird unterbrochen, sobald ein Datei- oder Verzeichnisname Leerzeichen enthält (was bei den meisten modernen Dateisystemen völlig legitim ist).
    Verwenden Sie stattdessen die Globbing-Funktion Ihrer Shell:

    shopt -s dotglob # to make the * glob match hidden files (like ls -a)
    for i in "$1"/*
    
  2. Setzen Sie Variablen immer in Anführungszeichen.
    Ihre Shell prüft Leerzeichen (Leerzeichen, Zeilenumbruch, …), um zu bestimmen, wo ein Befehlsargument endet und ein anderes beginnt. Betrachten Sie das folgende Beispiel:

    filename="foo bar"
    
    touch $filename
    # gets expanded to `touch foo bar`, so it creates two files named "foo" and "bar"
    
    touch "$filename"
    # gets expanded to `touch "foo bar`", so it creates a single file named "foo bar"
    
  3. Ein cdzu viele

    cd $1/$i       
    counting $i
    
    # which in turn calls ...
    ls -a $1
    

    ls-Parsing und nicht in Anführungszeichen gesetzte Variablen beiseite, wird hiermit versucht, den Inhalt des Verzeichnisses aufzulisten, ./foo/bar/barwenn Sie nur haben ./foo/bar.

verwandte Informationen