如何将ls -l文件目录列表按列排列并添加组权限后缀?
实现带组权限的多列文件列表展示
嘿,这个需求不难实现!我们可以通过组合几个常用的命令来搞定——用ls获取详细文件信息,awk提取并格式化内容,最后用column实现和ls一样的多列展示效果。直接上解决方案:
直接执行的命令
ls -l | awk '{ # 提取权限字符串中的组权限部分(第4-6位) group_perm = substr($1, 4, 3) # 定位文件名的起始位置(处理带空格的文件名) name_start = index($0, $9) file_name = substr($0, name_start) # 输出要求的格式:文件名:组权限 print file_name ":" group_perm }' | column
命令拆解说明
ls -l:输出当前目录下文件/目录的详细信息,包含权限、所有者、组、文件名等核心字段awk处理逻辑:substr($1, 4, 3):从权限字符串(比如-rw-r--r--)的第4个字符开始截取3位,精准拿到组权限(例子里的r--)index($0, $9)+substr(...):解决文件名带空格的问题——找到第9个字段(文件名的起始部分)在整行的位置,然后截取到行尾,确保完整获取带空格的文件名print file_name ":" group_perm:拼接成你需要的格式
column:把所有格式化后的单行条目,按照终端宽度自动整理成整齐的多列布局,和ls默认的列展示效果完全一致
进阶:做成可复用脚本
如果需要频繁使用,可以把这段逻辑写成脚本:
- 创建脚本文件
ls-group-perm:
#!/bin/bash # 支持传入目录路径作为参数,比如 ./ls-group-perm /home/user/docs ls -l "$@" | awk '{ group_perm = substr($1, 4, 3) name_start = index($0, $9) file_name = substr($0, name_start) print file_name ":" group_perm }' | column
- 给脚本添加执行权限:
chmod +x ls-group-perm
- 之后就可以像使用
ls一样调用它:
# 查看当前目录 ./ls-group-perm # 查看指定目录 ./ls-group-perm /path/to/your/dir
可选调整
- 如果需要显示隐藏文件,把
ls -l改成ls -la,如果要排除.和..,可以加过滤:ls -la | grep -v '^\.\.?$' | awk '{...}' | column - 想要自定义列宽度,可以给
column加-c参数,比如column -c 100强制用100字符宽度分列
内容的提问来源于stack exchange,提问作者alphabet122
相关产品推荐
相关产品推荐

