因此,我正在创建一个脚本,该脚本递归地计算当前目录中所有文件的大小以及子目录中所有文件的大小:
#!bin/bash
Count () {
size=0
items=`ls "${1}/"`
for item in $items
do
if [ ! -d $item ]
then
cursize=`ls -l $item | awk '{ print $6 }'`
size=$[$size+$cursize]
else
echo "$1/$item"
Count $1/$item
size=$[$size+$?]
fi
done
echo "Done"
return $size
}
Count ~
echo "$?"
但是,当我运行脚本时,我得到以下输出:
/home/161161/backup
Done
/home/161161/dir
ls: xoe1.txt: No such file or directory
script.sh: line 11: 28+: syntax error: operand expected (error token is "+")
1
xoe1.txt 是 dir 目录中的一个文件,当我在目录上执行 ls -l 时,我不知道为什么会出现这个问题:
ls -l dir
total 4
-rw-r--r-- 1 161161 domain users 23 Jun 2 22:55 test1.txt
-rw-r--r-- 1 161161 domain users 0 Jun 2 15:27 test2.txt
-rw-r--r-- 1 161161 domain users 0 Jun 2 15:27 test3.txt
-rw-r--r-- 1 161161 domain users 0 Jun 2 22:42 xoe1.txt <--
-rw-r--r-- 1 161161 domain users 0 Jun 2 22:42 xor1.txt
[161161@os ~]$
它表明文件确实存在。
有任何想法吗?
您的代码中的主要问题(除了在整个过程中使用不带引号的变量扩展以及您在不必要地循环输出
ls
之外)是您没有在运行的文件名前ls -l
加上其目录名。您也很难将大小输出与大小所在的目录配对。您还使用
return
从函数返回大小。该return
语句应该用于返回函数的退出状态(零为成功,非零为失败,值应小于 256)。壳函数实现:
这将给出所有目录的表观大小。
du
将给出磁盘上分配的实际大小。区别在于稀疏文件的计数方式。同样的事情,但
find
用于生成printdirsize
函数的目录路径名(此处提取并用作调用的内联脚本find
):与递归函数的唯一区别是输出中目录的顺序可能不同。
如果您只想要目录中所有文件的大小
du -sh *
不适合您?