You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:33:28