我需要一些帮助:
假设我在一个目录中,在这个目录中还有其他目录和文件等......
我想使用递归函数来计算其中和子目录中的所有文件和目录。
我知道我可以通过使用 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
。
一旦任何文件或目录名包含空格(这在大多数现代文件系统上是完全合法的),您的脚本就会中断。
相反,请使用 shell 的通配符功能:shopt -s dotglob # to make the * glob match hidden files (like ls -a) for i in "$1"/*
始终引用变量。
您的 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"
太多
cd
了cd $1/$i counting $i # which in turn calls ... ls -a $1
ls
./foo/bar/bar
- 除了解析和不带引号的变量之外,当您拥有的全部内容都是 时,这将尝试列出目录的内容./foo/bar
。