рекурсивный подсчет файлов и каталогов

рекурсивный подсчет файлов и каталогов

Мне нужна помощь в этом:

Допустим, я нахожусь в каталоге, а в этом каталоге есть другие каталоги, файлы и т. д.

Я хотел бы использовать рекурсивную функцию для подсчета всех файлов и каталогов в нем, а также в подкаталоге.

Я знаю, что могу решить эту проблему с помощью 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

Вот несколько вещей, которые вы можете улучшить (без претензий на полноту):

  1. Никогдапроанализируйте вывод ls.
    Ваш скрипт сломается, как только имя файла или каталога будет содержать пробелы (что совершенно допустимо в большинстве современных файловых систем).
    Вместо этого используйте функцию подстановки в вашей оболочке:

    shopt -s dotglob # to make the * glob match hidden files (like ls -a)
    for i in "$1"/*
    
  2. Всегда заключайте переменные в кавычки.
    Ваша оболочка проверяет пробельные символы (пробел, новая строка, …), чтобы определить, где заканчивается один аргумент команды и начинается другой. Рассмотрим следующий пример:

    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. Слишком cdмного

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

    ls-парсинг и переменные без кавычек в сторону, эта команда попытается вывести список содержимого каталога, ./foo/bar/barкогда у вас есть только ./foo/bar.

Связанный контент