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

如何在LS命令结果中包含路径?RHEL下为CSV输出添加目录项的方法

解决方法:生成带目录的CSV格式文件信息(文件名、日期、大小)

嘿,这个需求用RHEL自带的工具完全能搞定,我给你分享几个实用的方案,涵盖不同的思路,你可以根据自己的习惯选:

方案1:用find命令(最可靠,推荐)

find天生擅长递归遍历文件,而且能直接输出目录和文件名的信息,配合内置的printf就能完美生成你要的CSV,还能轻松处理带空格的文件名:

find . -type f -printf "%h,%f,%TY-%Tm-%Td %TH:%TM,%s\n"

参数解释:

  • %h:文件所在的相对目录(比如./docs)
  • %f:文件名(比如report.pdf)
  • %TY-%Tm-%Td %TH:%TM:格式化的修改日期时间(比如2024-06-25 14:30,你可以调整格式,比如用%Tb %Td得到Jun 25风格的日期)
  • %s:文件大小(字节)

如果需要完整绝对路径的目录,把.换成$PWD即可:

find $PWD -type f -printf "%h,%f,%TY-%Tm-%Td %TH:%TM,%s\n"

方案2:改进你原来的ls命令

如果坚持想用ls,可以通过捕获目录行的方式来补充目录信息,不过要注意处理带空格的文件名(建议加上--quoting-style=shell-escape避免字段拆分错误):

ls -lR --full-time --quoting-style=shell-escape | awk '
# 捕获目录行(比如"./docs:"),去掉末尾的冒号作为当前目录
/:$/ {
    current_dir = $0
    sub(/:$/, "", current_dir)
    next
}
# 处理普通文件行(以"-"开头)
/^-/ {
    # 文件名是从第9个字段到结尾,因为前面的字段是权限、链接数等
    filename = substr($0, index($0, $9))
    # 输出目录、文件名、修改日期时间、大小
    print current_dir "," filename "," $6 " " $7 "," $5
}
'

这个命令会递归遍历文件,把每个文件的所在目录和其他信息拼接成CSV格式。

方案3:用stat命令配合find

stat能输出更详细的文件元数据,结合find遍历可以灵活定制输出:

find . -type f -exec stat -c "%n,%y,%s" {} \; | awk -F, '
{
    # 从完整路径中拆分出目录(去掉最后一个"/"后的文件名)
    dir = $1
    sub(/\/[^\/]+$/, "", dir)
    # 拆分出文件名
    filename = substr($1, index($1, dir) + length(dir) + 1)
    # 截断修改时间的小数部分(比如把"2024-06-25 14:30:00.000000000 +0800"改成"2024-06-25 14:30:00")
    sub(/\..*/, "", $2)
    # 输出CSV行
    print dir "," filename "," $2 "," $3
}
'

额外问题:让ls输出完整/相对路径

ls本身没有直接输出路径的选项,但可以用这两种方式实现:

  • 用find调用ls:find . -type f -exec ls -l {} \;,这样ls会输出文件的完整相对路径
  • 开启bash的globstar特性(适合当前目录递归):
    shopt -s globstar
    ls -l --full-time "$PWD"/**/*
    
    这个命令会列出所有子目录的文件,并且显示完整绝对路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:13:55