
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):
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"/*
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"
Ein
cd
zu vielecd $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/bar
wenn Sie nur haben./foo/bar
.