如何查找匹配指定正则表达式的文件并将每个结果保存到数组中?
解决Bash中把find结果存入数组的问题
我来帮你搞定这个问题!首先你的find命令参数有个小错误,先修正这个,再教你正确把匹配文件存入数组的方法,避免文件名带空格这类坑。
第一步:修正你的find命令
你原来的命令里-name -regex是错误的用法——-name需要接通配符模式,而你想用正则匹配的话直接用-regex就好。另外GNU find的正则默认会匹配整个文件路径(包括./前缀),所以你的正则要加上这部分:
find . -type f -regex '\./\w{8}-\w{4}-\w{4}-\w{4}-\w{12}'
如果想让正则写法更符合POSIX扩展正则的习惯,可以加上-regextype posix-extended:
find . -type f -regextype posix-extended -regex '\./\w{8}-\w{4}-\w{4}-\w{4}-\w{12}'
第二步:把find结果存入数组(重点避免空格拆分)
用普通变量result=$(find ...)存储结果再转数组的问题在于:Bash会把结果按IFS(默认是空格、制表符、换行)拆分,要是文件名里带空格,就会被拆成多个数组元素,完全乱掉。推荐两种靠谱的方法:
方法1:用mapfile(Bash 4.0+ 推荐)
这是最简单的方式,mapfile会直接把命令输出的每一行存入数组,自动处理换行,还能去掉每行末尾的换行符:
# 把find结果存入files数组 mapfile -t files < <(find . -type f -regex '\./\w{8}-\w{4}-\w{4}-\w{4}-\w{12}')
方法2:用while循环读取(兼容旧版Bash)
如果你的Bash版本低于4.0,用while循环逐行读取是更稳妥的选择,同样能避免空格拆分:
# 初始化空数组 files=() # 逐行读取find的输出,存入数组 while IFS= read -r file; do files+=("$file") done < <(find . -type f -regex '\./\w{8}-\w{4}-\w{4}-\w{4}-\w{12}')
第三步:验证和使用数组
你可以遍历数组查看结果,记得用"${files[@]}"的写法,才能正确保留带空格的文件名:
for file in "${files[@]}"; do echo "匹配到的文件:$file" done
内容的提问来源于stack exchange,提问作者M Suhayl
相关产品推荐
相关产品推荐

