求助:Bash中查找含空格文件夹并存储到数组的正确方法
纯Bash环境下处理含空格文件夹路径到数组的可行方案
方案一:用readarray(Bash 4.0+ 优先推荐)
借助find的-print0参数输出以空字符分隔的路径,搭配readarray的-d ''选项读取,能完美处理带空格、换行的特殊路径,同时可嵌入验证逻辑:
# 自定义搜索路径和验证规则,把符合条件的目录存入数组 readarray -d '' valid_dirs < <(find /目标搜索路径 -type d -print0 | while IFS= read -r -d '' dir; do # 这里写你的验证逻辑,比如检查目录是否存在、是否可读 if [ -d "$dir" ]; then printf '%s\0' "$dir" fi done)
-print0让find用空字符而非换行分隔路径,彻底避免空格导致的拆分问题< <(...)是进程替换,不会创建独立子进程,因此数组修改能在当前shell生效- 验证逻辑可按需调整,比如添加
[ -r "$dir" ]检查目录可读权限
方案二:兼容Bash 3.x的while read写法
如果你的Bash版本低于4.0,用进程替换配合while read循环填充数组,同样能规避子进程和空格拆分问题:
# 初始化空数组 valid_dirs=() while IFS= read -r -d '' dir; do # 验证逻辑示例:确认是目录 if [ -d "$dir" ]; then valid_dirs+=("$dir") fi done < <(find /目标搜索路径 -type d -print0)
IFS=防止路径首尾的空格被截断-r禁止反斜杠转义,保证路径原样读取-d ''指定空字符作为读取分隔符,和find的-print0对应
之前方法失效的原因
- 直接捕获输出转数组:
dirs=$(find ...)后arr=($dirs)会按Bash默认的IFS(空格、换行、制表符)拆分字符串,含空格的路径被拆成多个数组元素 - 管道配合
read:管道会创建子进程,子进程内对数组的修改无法传递到父进程,最终父进程数组为空
内容的提问来源于stack exchange,提问作者ElRudi
相关产品推荐
相关产品推荐

