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编写代码,等等。在得到答案后,不要试图破坏你的问题。