
Мне нужна помощь в этом:
Допустим, я нахожусь в каталоге, а в этом каталоге есть другие каталоги, файлы и т. д.
Я хотел бы использовать рекурсивную функцию для подсчета всех файлов и каталогов в нем, а также в подкаталоге.
Я знаю, что могу решить эту проблему с помощью wc ... grep или find, но на самом деле я пытаюсь использовать здесь свою первую рекурсивную функцию.
Это то, что я сделал до сих пор, но это не работает должным образом.
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"
решение1
Вот несколько вещей, которые вы можете улучшить (без претензий на полноту):
Никогдапроанализируйте вывод
ls
.
Ваш скрипт сломается, как только имя файла или каталога будет содержать пробелы (что совершенно допустимо в большинстве современных файловых систем).
Вместо этого используйте функцию подстановки в вашей оболочке:shopt -s dotglob # to make the * glob match hidden files (like ls -a) for i in "$1"/*
Всегда заключайте переменные в кавычки.
Ваша оболочка проверяет пробельные символы (пробел, новая строка, …), чтобы определить, где заканчивается один аргумент команды и начинается другой. Рассмотрим следующий пример: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"
Слишком
cd
многоcd $1/$i counting $i # which in turn calls ... ls -a $1
ls
-парсинг и переменные без кавычек в сторону, эта команда попытается вывести список содержимого каталога,./foo/bar/bar
когда у вас есть только./foo/bar
.