递归计算文件和目录

递归计算文件和目录

我需要一些帮助:

假设我在一个目录中,在这个目录中还有其他目录和文件等......

我想使用递归函数来计算其中和子目录中的所有文件和目录。

我知道我可以通过使用 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
    一旦任何文件或目录名包含空格(这在大多数现代文件系统上是完全合法的),您的脚本就会中断。
    相反,请使用 shell 的通配符功能:

    shopt -s dotglob # to make the * glob match hidden files (like ls -a)
    for i in "$1"/*
    
  2. 始终引用变量。
    您的 shell 会查看空白字符(空格、换行符等)来确定一个命令参数的结束位置和另一个命令参数的开始位置。考虑以下示例:

    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

相关内容