如何在Bash中获取/usr/bin下各可执行文件的简要描述?
获取/usr/bin下可执行文件的man NAME描述并排序
这是一个可以直接运行的Bash脚本,完美匹配你的需求:
cd /usr/bin && for exe in *; do # 只筛选有执行权限的文件 if [ -x "$exe" ]; then # 调用man命令提取NAME部分,忽略无man页的错误输出 man "$exe" 2>/dev/null | awk '/^NAME$/{getline; print $0}' | sed -E 's/^([^ ]+) +- (.*)/\1 - \2/' fi done | sort
各部分逻辑拆解:
cd /usr/bin:先切换到目标目录,避免处理复杂路径,直接遍历文件名即可for exe in *:遍历目录下的所有文件if [ -x "$exe" ]:确保只处理具备执行权限的可执行程序man "$exe" 2>/dev/null:调用对应程序的man手册,2>/dev/null用来忽略那些没有man页的程序抛出的错误,避免干扰最终输出awk '/^NAME$/{getline; print $0}':精准定位到man手册里的NAME标题行,然后获取下一行的命令描述内容sed -E 's/^([^ ]+) +- (.*)/\1 - \2/':统一格式,把NAME行里的多空格、不规则分隔转换成标准的命令 - 描述样式| sort:最后将所有结果按字母顺序排序输出
优化版(适配多命令NAME行)
如果遇到某些程序的man页NAME部分同时列出多个关联命令(比如grep, egrep, fgrep - print lines matching a pattern),上面的脚本可能会输出不准确的内容,这个优化版能确保每个可执行文件对应自己的描述:
cd /usr/bin && for exe in *; do if [ -x "$exe" ]; then man "$exe" 2>/dev/null | awk -v exe="$exe" '/^NAME$/{flag=1;next} flag && /^[^ ]/{sub(/^[^-]+- /,""); print exe " - " $0; flag=0}' fi done | sort
这个版本通过awk传递当前遍历的命令名,替换掉NAME行里的命令前缀,直接输出当前程序名+描述,避免多命令场景下的混乱。
内容的提问来源于stack exchange,提问作者André Shevantes
相关产品推荐
相关产品推荐

