Shell脚本筛选列出指定大小范围内文件的实现方法
Shell脚本按大小区间筛选文件的问题修复
需求是列出目录下所有文件大小处于指定区间的文件,开发过程中可以正常获取目录内所有txt文件的大小,但if条件语句无法将$FILESIZE变量作为整数执行范围判断。
初始错误代码
最开始编写的存在问题的代码如下:
#!/bin/bash for i in *.txt do FILESIZE=$(stat -c%s "$i") echo "$FILESIZE" if [ 9 -lt $((FILESIZE)) -gt 10 ] then echo "$i" fi done
这段代码运行后输出完全不符合预期,无法正确筛选出目标大小的文件。
踩坑说明:Shell的
test条件判断(也就是[]包裹的判断逻辑)不支持a -lt b -gt c这种连续比较写法,这种写法不会按“b同时大于a、小于c”的逻辑执行,会直接导致判断逻辑失效。
修正后可用代码
调整方案:先把获取到的文件大小值转为整数存入val变量,通过两层嵌套if语句分别判断大小的上下阈值,修正后可正常运行的代码如下:
#!/bin/bash for i in *.txt do FILESIZE=$(stat -c%s "$i") val=$((FILESIZE)) if [ $val -gt 9 ] then if [ $val -lt 21 ] then echo "$i" echo "size of $i is $val" fi fi done
修正后的代码可以正确输出大小在10-20字节区间的txt文件名及对应大小值,完全满足筛选需求。
小提示:如果不想写嵌套判断,也可以用逻辑与参数-a把两个条件合并到同一个判断语句里,写法为if [ $val -gt 9 -a $val -lt 21 ],运行效果和嵌套判断完全一致。
内容的提问来源于stack exchange,提问作者Abhijit Aravind
相关产品推荐
相关产品推荐

