Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用于计算奇数文件大小的脚本_Linux_Shell_Scripting - Fatal编程技术网

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

Linux 用于计算奇数文件大小的脚本,linux,shell,scripting,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 " "`

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

#!/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
#/bin/bash
echo“目录包含以下奇数大小的文件名:”
ls-l$1|
在读取文件时
做
大小=`echo$file_parm | cut-f 5-d“”`
name=`echo$file_parm | cut-f 9-d“”`
让“div=大小%2”
如果[!-d$name]
然后
如果[$div-东北0]
然后
#这是从这个列表中列出的奇数
#目录;我只需要把它们加在一起
#并打印结果
echo“[$name:$size]”
fi
fi
完成

我实际上是从我的评论中复制了代码并运行了它,它起到了作用——我只需确保我将
$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-”]
符号。

。您的问题(假设您尝试在循环期间添加大小)可能是管道生成子shell,而变量分配无法逃避这一事实。使用循环而不是
ls
将解决该问题,并使您的脚本更好。您是否在Linux上?如果是这样,我可能会使用:
totsize=0;以“$1”/*格式存档;如果[-f“$file”],则执行此操作;然后size=$(stat-c'%s'$文件);如果((大小%2==1));然后回显“[$file:$size]”;((totsize+=$size));fi;fi;完成;echo“奇数大小文件的总大小=$totsize”
。如果没有,我可能会得到GNU的
stat
命令(来自
core-utils
)并使用它,或者编写一个代理来完成这项工作(C、或Perl、或Python、或…),等等@JonathanLeffler可以更简单:
stat-C“%s%n'$1”/*;而read-r size name;do…
--添加
%F
是否明确要排除目录(根据我的经验,目录总是(偶数)的倍数)块大小。@glennjackman:除非你小心,否则从管道读取的循环中设置的变量不会影响主shell。我认为有一个
shopt
选项会影响这个问题,或者你可以使用显式子shell编写代码,等等。在得到答案后,不要试图破坏你的问题。