Linux find查找含单引号文件名 结果存入数组路径格式异常问题
解决方案
问题根因
- 原有代码将find的全部输出用双引号包裹后赋值给数组,会把所有路径拼接成单个字符串存入数组的第一个元素,数组结构本身就是错误的
- 原有
-name判断逻辑冗余,-name "\'*[[:space:]]*\'" -o -name "*"等价于匹配所有文件,没有实际作用
实现步骤
第一步:正确读取find结果到数组
使用零字节作为分隔符读取find结果,完全避免文件名包含空格、换行等特殊字符导致的拆分错误:
# 读取所有可读普通文件路径到数组,零分隔符保证特殊文件名正确解析 mapfile -d $'\0' files_arr < <(find "$1" -type f -perm -a=r -print0)
第二步:路径格式化处理
对数组中每个路径做分段处理,仅给包含空格的路径段包裹单引号,无空格的段保持原样:
processed_arr=() for raw_path in "${files_arr[@]}"; do # awk按/分割路径,判断每段是否含空格,含空格则加单引号后重新拼接 formatted_path=$(awk -F/ ' { for(i=1;i<=NF;i++){ if($i ~ /[[:space:]]/) $i = "\047" $i "\047" } print }' OFS=/ <<< "$raw_path") processed_arr+=("$formatted_path") done
效果验证
对路径not easy/file one处理后得到'not easy'/'file one',对无空格路径data/log.txt处理后保持原格式不变,完全符合需求。
内容的提问来源于stack exchange,提问作者Thomas99
相关产品推荐
相关产品推荐

