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

Bash脚本:如何匹配正则查找文件并将结果存入变量?

问题解决

你的脚本存在两个核心问题:正则表达式无法匹配目标文件名格式,以及直接将find结果存为字符串会导致文件名含空格时遍历出错。以下是具体修正方案:

1. 修正文件名匹配规则

原正则(part.[a-z])仅能匹配part.后跟随1个小写字母的文件(如part.a),而你需要匹配part.后跟随至少2个小写字母的文件,可通过两种方式实现:

方式一:用-name通配符(更简洁)

-name支持Shell通配符,part.[a-z][a-z]*可精准匹配part.后至少两个小写字母的文件:

#!/bin/bash
temp_dir="$(dirname "$0")/../temp/"
# 直接循环处理find结果,避免文件名含空格的问题
find "$temp_dir" -type f -name "part.[a-z][a-z]*" | while read -r file; do
    echo "处理文件:$file"
    # 此处添加你的业务处理逻辑
done

方式二:用-regex精确匹配

若坚持用正则,需注意find默认正则匹配整个文件路径,且.需转义(否则匹配任意字符),搭配-regextype posix-extended支持{2,}表示至少2次匹配:

#!/bin/bash
temp_dir="$(dirname "$0")/../temp/"
find "$temp_dir" -type f -regextype posix-extended -regex ".*/part\.[a-z]{2,}" | while read -r file; do
    echo "处理文件:$file"
done

规则解释:

  • .*/:匹配文件路径的前缀部分(因正则需匹配完整路径)
  • part\.:字面量匹配part.,.转义后避免匹配任意字符
  • [a-z]{2,}:匹配至少2个连续小写字母

2. 正确存储结果并遍历

若需先存储结果再遍历,禁止用普通字符串变量,改用Bash数组——数组可完整保留含空格的文件名:

#!/bin/bash
temp_dir="$(dirname "$0")/../temp/"
# 将find结果逐行存入数组
mapfile -t file_list < <(find "$temp_dir" -type f -name "part.[a-z][a-z]*")

# 遍历数组,确保每个文件名独立处理
for file in "${file_list[@]}"; do
    echo "处理文件:$file"
done

mapfile -t会将find的每行输出存入数组,${file_list[@]}展开数组时会保留每个文件名的完整性。

路径正确性验证

你使用的$(dirname "$0")/../temp/路径是正确的:脚本位于./scripts/script.sh,dirname "$0"得到./scripts,拼接../temp后即为目标路径../temp。若需绝对路径避免相对路径歧义,可改为:

temp_dir="$(cd "$(dirname "$0")/.." && pwd)/temp"

此写法可确保无论脚本在哪个目录执行,都能准确定位到temp目录。

内容的提问来源于stack exchange,提问作者Omar Dulaimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:15:42