You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找匹配指定正则表达式的文件并将每个结果保存到数组中?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:07:29