KornShell中ls命令显示人类可读文件大小的问题求助
解决KornShell中ls无法显示可读文件大小的问题
你的问题根源在于部分Unix/Linux系统(如老版AIX、Solaris或BSD)自带的ls并非GNU版本,不支持-h或--block-size这类简化文件大小显示的参数。以下是几种可行的解决办法:
1. 使用GNU ls(如果可用)
很多系统会把GNU coreutils的工具以g前缀命名,比如gls。如果你的环境安装了GNU coreutils,直接替换脚本中的ls为gls即可:
# 遍历目标目录并列出文件(带可读大小) for target_dir in /path/to/dir1 /path/to/dir2; do cd "$target_dir" || continue # 切换目录失败则跳过 gls -lrt --human-readable done
如果不确定是否有gls,可以执行which gls或gls --version验证。
2. 用stat+自定义函数转换大小
如果没有GNU ls,可借助stat命令获取原始字节数,再通过自定义KornShell函数转换为可读格式:
# 定义字节转可读格式的函数 human_readable_size() { local byte_count=$1 local -a suffixes=("B" "k" "M" "G" "T") local idx=0 while (( byte_count >= 1024 && idx < ${#suffixes[@]}-1 )); do byte_count=$(( byte_count / 1024 )) (( idx++ )) done echo "${byte_count}${suffixes[$idx]}" } # 遍历目录处理文件 for target_dir in /path/to/dir1 /path/to/dir2; do cd "$target_dir" || continue # 注意:不同系统的stat参数可能不同,以下是GNU stat的格式 # BSD系统请替换为:stat -f "%N %z %Sm" * stat -c "%y %s %n" * | while read -r mtime size filename; do readable_size=$(human_readable_size "$size") echo "$mtime $readable_size $filename" done | sort -k1,1 # 按修改时间排序,模拟ls -rt的效果 done
3. 用awk处理ls输出(应急方案)
如果上述工具都不可用,可以直接解析ls -lrt的输出,用awk将字节数字段转换为可读格式:
# 遍历目录并处理ls输出 for target_dir in /path/to/dir1 /path/to/dir2; do cd "$target_dir" || continue ls -lrt | awk ' # awk内部的转换函数 function humanize(num) { split("B k M G T", suff) for(i=1; num>=1024 && i<5; i++) { num /= 1024 } return sprintf("%.1f%s", num, suff[i]) } BEGIN {OFS=" "} # 跳过total行,修改第5个字段(字节数)后打印整行 !/^total/ { $5 = humanize($5); print } ' done
注意:这种方法在文件名包含空格时可能出错,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Mohammed Shaheer
相关产品推荐
相关产品推荐

