Bash:通过目录迭代很奇怪

时间:2014-04-06 20:16:27

标签: linux bash unix iteration filesize

#!/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子句之前,是否所有文件大小都附加到可变大小?我很困惑。

3 个答案:

答案 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`'.'