如何将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
相关产品推荐
相关产品推荐

