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

