Ubuntu Server下基于选择菜单的目录导航BASH脚本求助
实用的Bash目录导航菜单脚本优化方案
首先,你的原脚本已经搭好了基础的选择菜单框架,但存在几个影响实用性的小问题:比如没法处理带空格的文件名、只能单次选择后退出、没有真正实现目录跳转功能。下面是适配Ubuntu Server环境的优化版本,解决这些问题的同时让导航更顺手:
#!/bin/bash # 初始目录,可根据你的需求修改 current_dir="$HOME/ftp/server/googledrive" # 定义核心导航函数 navigate_dir() { while true; do # 安全获取当前目录下的所有条目(避免空格/特殊字符分割错误) options=() while IFS= read -r -d $'\0' item; do # 提取条目名称(去掉完整路径前缀) item_name="${item##*/}" options+=("$item_name") done < <(find "$current_dir" -maxdepth 1 -mindepth 1 -print0 | sort -z) # 添加实用操作选项 options+=("返回上一级目录" "退出导航") echo -e "\n当前目录: $current_dir" prompt="请选择要进入的目录或操作:" PS3="$prompt " select opt in "${options[@]}"; do case $REPLY in # 处理退出导航 $((${#options[@]}))) echo "退出导航..." exit 0 ;; # 处理返回上一级目录 $((${#options[@]}-1))) if [ "$current_dir" = "/" ]; then echo "已经在根目录,无法返回上一级" else current_dir=$(dirname "$current_dir") fi break ;; # 处理目录选择 [1-$(( ${#options[@]}-2 ))]) selected_item="$current_dir/${options[$((REPLY-1))]}" # 只允许进入目录,跳过文件 if [ -d "$selected_item" ]; then current_dir="$selected_item" else echo "⚠️ '$selected_item' 不是目录,无法进入" fi break ;; *) echo "❌ 无效选择,请重新输入" ;; esac done done } # 启动导航功能 navigate_dir
关键改进点说明:
- 完美兼容特殊文件名:用
find -print0搭配read -d $'\0'的组合,彻底解决了原脚本中ls会按空格分割文件名的问题,带空格、换行符的目录名也能正常识别 - 支持连续导航:通过
while true循环实现连续目录跳转,不用每次重启脚本 - 智能区分目录/文件:自动判断选中条目是否为目录,避免误操作进入文件
- 新增返回上一级功能:补充了返回上级目录的选项,导航逻辑更完整
- 友好交互提示:显示当前目录、错误提示信息,提升使用体验
使用步骤:
- 将脚本保存为
dir_navigator.sh - 赋予执行权限:
chmod +x dir_navigator.sh - 直接运行即可开始导航:
./dir_navigator.sh
内容的提问来源于stack exchange,提问作者GMBeniamin
相关产品推荐
相关产品推荐

