#!/bin/bash
for dir in "/home/$USER/sessions/out/*/"; do
size=$(stat -c %s $dir/log)
if [ 1 -ne 0 ]; then
echo $size.
fi
done
今天开始使用bash。我试图检查home / sessions / out中所有目录中日志文件的大小。如果1!= 0(总是作为测试),则应打印日志的文件大小。我得到的是:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57344001 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 966904.
我希望在每个文件大小之后有一段时间,我实际上得到一个句号。在到达if子句之前,是否所有文件大小都附加到可变大小?我很困惑。
答案 0 :(得分:4)
问题是路径名扩展('*'的扩展)发生在stat
调用中,而不是在循环声明中,因为引用了循环中的路径,但是stat
中的路径调用不是。
即。只有一次循环迭代发生,dir
的值为/home/$USER/sessions/out/*/
。然后在stat调用中进行扩展,将所有匹配/home/$USER/sessions/out/*/log
的路径提供给stat
。
解决方案是在循环声明中取消引用路径并在stat
调用中引用它。
像这样:
#!/bin/bash
for dir in /home/$USER/sessions/out/*/; do
size=$(stat -c %s "$dir/log")
if [ 1 -ne 0 ]; then
echo $size.
fi
done
答案 1 :(得分:1)
您的整个程序可以简化为一行
stat -c %s /home/$USER/sessions/out/*/log
答案 2 :(得分:0)
不太确定为什么你有一个1!= 0的测试条件,它总是在那里评估为真。但是,以下循环将为您完成:
for LOGFILE in `find $LOGPATH -type f -iname 'log'`
do
echo `stat -c %s $LOGFILE`'.'
done
我使用了变量LOGPATH,你可以使用' / home / $ USER / sessions / out。'如果这是在一个脚本文件中,那么在脚本的顶部使用这样的变量是明智的,这样如果需要它可以在以后轻松更改。
' -type f'是否存在名称为log的目录,您可能不想解析。如果不是这样,那么你可以省略它。
我使用了find命令,因为你对它有更精细的控制。您可以设置搜索深度,文件类型,文件大小等。要在最后得到句号,只需在echo语句的末尾单独引用句点。
如果您需要文件名,然后是大小,只需更改echo语句,如下所示:
echo "$LOGFILE" `stat -c %s $LOGFILE`'.'