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

如何将Unix下ls -l输出转换为不受文件名空格干扰的TSV文件?

解决ls -l输出转制表符分隔文件(TSV)的问题

直接用sed -E 's/ +/\t/g'替换空格的方法会因为文件名含空格失效,这里给几个基于GNU工具的可靠方案:

方案一:用awk精准分割字段

ls -l的输出中,前7个字段是固定格式的元数据(权限、链接数、所有者、组、文件大小、日期、时间),从第8个字段开始的所有内容就是文件名(包含空格)。用awk可以精准处理:

ls -l | awk 'NR==1{print $0; next} {for(i=1;i<=7;i++) printf "%s\t", $i; $0=""; for(i=8;i<=NF;i++) $0=$0 $i " "; sub(/ $/, "", $0); print $0}'
  • 第一行(total开头)直接原样输出
  • 后续行先输出前7个字段,每个字段后加制表符
  • 把第8到最后一个字段拼接成完整文件名(自动保留空格),去掉末尾多余空格后输出

方案二:用find替代ls生成结构化输出

find的格式化输出天生适合处理带空格的文件名,用它直接生成TSV格式更稳妥:

# 仅处理当前目录下的目录(对应示例场景),如需所有文件去掉-type d
find . -maxdepth 1 -type d -printf "%M\t%n\t%u\t%g\t%s\t%Tb %Td\t%H:%M\t%f\n" | grep -v "^./\." | sed "1i $(ls -l | head -1)"
  • -maxdepth 1限制只处理当前目录
  • -printf指定输出格式,对应ls -l的各个字段
  • grep -v "^./\."过滤隐藏目录
  • 最后自动获取并添加ls -l的total行

方案三:用GNU ls的自定义格式化输出

GNU ls支持--printf参数直接指定输出格式,一步生成所需结构:

ls -l --printf "%M\t%n\t%u\t%g\t%s\t%b %e\t%H:%M\t%f\n" | sed "1i $(ls -l | head -1)"
  • --printf的格式参数对应ls -l的各个字段,自动保留文件名空格
  • 先去掉ls -l默认输出的total行,再用原total行替换开头

内容的提问来源于stack exchange,提问作者Hirak Sarkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:02:13