UNIX环境下如何使用ls -d */命令仅列出目录排除文件
UNIX环境下仅列出当前目录所有文件夹的方法
问题原因排查
正常情况下ls -d */本应仅匹配末尾带/的目录条目,如果你执行后仍返回普通文件,通常是两种原因导致:
- 当前目录存在名称以/结尾的非常规普通文件
- ls命令被设置了带额外参数的别名(比如默认加了
-a/-A等参数),可执行alias ls检查是否有别名配置,存在的话可以加\前缀调用原生ls,比如\ls -d */
可用解决方案
方案1:基于ls命令调整(适配大部分常规场景)
添加参数避免别名干扰,同时过滤非目录条目:
\ls -d -- */ | grep '/$'
参数说明:
\ls:调用原生ls命令,跳过别名配置--:防止有名称以-开头的目录被识别为命令参数grep '/$':强制仅保留末尾带/的目录条目,过滤普通文件
方案2:find命令实现(全POSIX环境兼容,最稳妥)
仅列出当前一级目录下的文件夹,不递归扫描子目录:
# 输出带./前缀的目录路径 find . -maxdepth 1 -type d ! -name '.' # 输出不带前缀的纯目录名 find . -maxdepth 1 -type d ! -name '.' -exec basename {} \;
参数说明:
-maxdepth 1:限制仅扫描当前目录,不向下递归-type d:仅匹配目录类型的文件! -name '.':排除当前目录本身的输出
方案3:shell内置循环实现(无需调用外部命令,效率最高)
通过内置判断过滤非目录条目,适配所有shell环境:
for d in */; do [ -d "$d" ] && echo "${d%/}"; done
说明:[ -d "$d" ]强制校验条目是否为真实目录,${d%/}用于删除目录名末尾的/符号,不需要删除的话直接替换为echo "$d"即可。
内容的提问来源于stack exchange,提问作者StickyRoll
相关产品推荐
相关产品推荐

