Bash如何按文件大小排序遍历目录文件供for循环处理
需求说明
作为站长日常工作会产生大量冗余代码垃圾文件,需要定期按文件扩展名筛选清理无用文件:例如执行cleaner txt命令即可清理所有txt后缀的文件,这一基础功能实现逻辑非常简单。现在需要新增逻辑:先将待处理的目标文件按大小排序,再传入for循环执行后续的预览、删除操作。
原有cleaner脚本代码
#/bin/bash if [ -z "$1" ]; then echo "Please supply the filename suffixes to delete."; exit; fi; filter=$1; for FILE in *.$filter; do clear; cat $FILE; printf '\n\n'; rm -i $FILE; done
实现方法
原有脚本直接通过通配符*.$filter获取文件列表,默认按照文件名字典序排列,要实现按大小排序,只需要把遍历的文件列表替换为按大小排序后的结果即可:
- 使用
ls命令的-S参数可以实现按文件大小降序排列(文件越大越靠前),如果需要从小到大升序排列,追加-r参数即可 - 追加
-1参数强制ls每行只输出一个文件名,避免终端多列显示导致的文件名解析错误 - 顺带修复原有脚本的两个小问题:一是shebang行少写了
!,正确写法应为#!/bin/bash;二是变量引用增加双引号包裹,避免文件名带空格时执行出错。
修改后的完整脚本如下:
#!/bin/bash if [ -z "$1" ]; then echo "Please supply the filename suffixes to delete." exit 1 fi filter=$1 # 按文件大小降序遍历,要升序就把S改成Sr for FILE in $(ls -1S *."$filter"); do clear cat "$FILE" printf '\n\n' rm -i "$FILE" done
注:如果目录下存在带换行符的特殊文件名,上述ls遍历的方式会有解析问题,但日常运维场景下极少出现这类文件名,完全可以满足使用需求。
内容的提问来源于stack exchange,提问作者verlager
相关产品推荐
相关产品推荐

