自定义递归版ls命令故障求助:仅输出目录名无法正常递归
递归ls脚本问题修复
原脚本的核心问题是路径处理错误,导致无法正确识别子目录,递归逻辑根本没触发,所以看起来只输出目录名称。具体问题和修复方案如下:
原脚本的问题点
- 变量未初始化:
singletab(缩进符)和thisfile(当前路径)都没初始值,第一次运行时thisfile为空,拼接后变成/文件名,而不是当前目录下的相对路径,导致[ -d "$thisfile" ]判断失败,无法触发递归。 - 用
ls获取目录内容不安全:$(command ls $thisfile)会把带空格/特殊字符的文件名拆成多个参数,递归调用时参数混乱。 - 全局变量维护路径易出错:用全局变量
thisfile和tab维护路径和缩进,递归时容易互相干扰,导致路径回退错误。 - 输出未加引号:
echo -e $tab$file没加引号,文件名含空格时会被拆分成多个部分输出。
修复后的脚本
recdir () { # 初始化缩进符,仅第一次调用时生效 : "${singletab:=$'\t'}" # 处理当前层级的缩进和路径:第一次调用无缩进,路径为传入参数(默认当前目录) local indent="" local current_path="" if [ "$#" -eq 0 ]; then current_path="." elif [ "$#" -eq 1 ]; then current_path="$1" else indent="$1" current_path="$2" fi # 输出当前文件/目录名(仅显示最后一级) echo "${indent}${current_path##*/}" # 如果是目录,递归遍历所有内容 if [ -d "$current_path" ]; then local new_indent="${indent}${singletab}" # 用glob安全获取目录下所有内容(含隐藏文件) for item in "$current_path"/* "$current_path"/.[!.]*; do # 跳过不存在的匹配(比如无隐藏文件时的空匹配) [ -e "$item" ] || continue # 递归调用,传递新缩进和完整路径 recdir "$new_indent" "$item" done fi } # 调用示例:可指定路径,默认当前目录 recdir
关键修改说明
- 变量初始化:用
${singletab:=$'\t'}确保第一次调用时把缩进符设为制表符,避免空值。 - 参数传递路径和缩进:把缩进和完整路径作为参数传递,替代全局变量,避免递归时的变量干扰,路径更准确。
- 安全获取目录内容:用
"$current_path"/*和"$current_path"/.[!.]*获取目录内容,支持带空格的文件名,同时包含隐藏文件。 - 路径处理优化:用
${current_path##*/}提取文件/目录的最后一级名称,输出更清晰;跳过不存在的匹配项,避免错误。
内容的提问来源于stack exchange,提问作者Maciej Basczok
相关产品推荐
相关产品推荐

