用于计算奇数文件大小的脚本

时间:2015-02-03 22:19:38

标签: linux shell scripting

我需要编写一个脚本来计算大小为奇数的文件的总大小;你能帮帮我吗?

#!/bin/bash
echo "Directory <$1> contains the following filenames of odd size:"
ls -l $1 |
while read file_parm
do
        size=`echo $file_parm | cut -f 5 -d " "`
        name=`echo $file_parm | cut -f 9 -d " "`

        let "div=size%2"

        if [ ! -d $name ]
        then
                if [ $div -ne 0 ]
                then
                        # this is listing odd numbers from this
                        # directory; I just need to add them together
                        # and print result
                        echo "[$name : $size]"
                fi
       fi
done

1 个答案:

答案 0 :(得分:1)

我几乎从我的评论中复制了代码并运行它,并且它有效 - 我只需要确保$1设置为某个理智的地方,而不是空的。

$ set -- "."; totsize=0; for file in "$1"/*; do if [ -f "$file" ]; then size=$(stat -c '%s' "$file"); if ((size % 2 == 1)); then echo "[$file : $size]"; ((totsize += $size)); fi; fi; done; echo "Total size of odd-sized files = $totsize"
[./bash-assoc-arrays.sh : 417]
[./makefile : 1125]
[./xx.pl : 117]
Total size of odd-sized files = 1659
$

或者,为了便于阅读而格式化:

set -- "."
totsize=0
for file in "$1"/*
do
    if [ -f "$file" ]
    then
        size=$(stat -c '%s' "$file")
        if ((size % 2 == 1))
        then
            echo "[$file : $size]"
            ((totsize += $size))
        fi
    fi
done
echo "Total size of odd-sized files = $totsize"

重复调用stat有点贵。如果你的名字中没有包含换行符的文件(大多数人都没有),你可以通过stat的一次调用来加快速度:

stat -c '%s %F %n' "$1"/* |
{
totsize=0
while read size type name
do
    if [ "X$type" = "X-" ] && ((size % 2 == 1))
    then
        ((totsize+=$size))
        echo "[$name : $size]"
    fi
done
echo "Total size of odd-sized files = $totsize"
}

您可以使用(...)代替{...},以效率的边际(不可衡量的)成本。

其他问题的答案解释了[ "X$type" = "X-" ]符号。