Bash中从命令结果生成数组时避免分词及含空格目录排序问题
Bash中从命令结果生成数组时避免分词及含空格目录排序问题
我太懂你这个烦恼了!当目录名里带空格时,用普通的命令替换方式存数组,bash会默认按空格、制表符、换行拆分输出内容,直接把带空格的目录(比如My Documents)拆成My和Documents两个数组元素,这就从根上错了,后面再怎么调分隔符都救不回来。咱们一步步来解决这个问题:
原方法的核心问题
你一开始写的selections=( $(find . -maxdepth 1 -type d) ),本质是依赖bash的命令替换分词规则,而这个规则对含空格的文件名非常不友好,直接破坏了目录名的完整性,导致后续排序完全失效。
正确的数组生成姿势:用null字符分隔
处理含特殊字符的文件名,bash里的标准操作是用null字符作为分隔符(因为文件名里永远不会出现null)。我们可以配合find的-print0选项和readarray的-d ''参数,安全读取目录到数组:
# 读取所有一级目录(包括带空格的)到数组,保留./前缀 readarray -d '' selections < <(find . -maxdepth 1 -type d -print0) # 去掉第一个元素(当前目录.) unset selections[0]
如果不想保留./前缀,直接让find输出不带前缀的目录名更省事:
# 直接获取不带./的一级目录(自动排除当前目录.) readarray -d '' selections < <(find . -maxdepth 1 -type d ! -name '.' -printf '%P\0')
正确排序含空格的目录
现在数组里的每个元素都是完整的目录名了,排序时也要用支持null分隔的方式,避免空格干扰:
# 对数组内容排序,用null分隔保证安全 readarray -d '' sorted_selections < <(printf '%s\0' "${selections[@]}" | sort -z)
完整示例脚本
把上面的步骤整合起来,就是一个能完美处理带空格目录的脚本:
#!/bin/bash # 一步到位:获取不带./的一级目录,排序后存数组 readarray -d '' sorted_selections < <(find . -maxdepth 1 -type d ! -name '.' -printf '%P\0' | sort -z) # 遍历输出验证结果 echo "排序后的目录:" for dir in "${sorted_selections[@]}"; do echo "- $dir" done
这样不管目录名里有空格、换行还是其他特殊字符,都能正确读取和排序啦。
备注:内容来源于stack exchange,提问作者Abbatrombone
相关产品推荐
相关产品推荐

