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
相关产品推荐
相关产品推荐

