将Shell的find逻辑转为Python脚本并过滤指定.vrlp文件
问题解决:过滤基础.vrlp文件并将Shell提取逻辑转为Python
一、过滤基础.vrlp文件的Shell实现优化
原脚本用于遍历db/test/vs目录下所有.vrlp文件,现需仅保留无变体后缀的基础文件(即文件名仅以.vrlp结尾,无.ce.template.a这类中间变体标识)。
优化后的Shell命令
# 方式1:反向排除带变体后缀的文件 find db/test/vs -type f -name "*.vrlp" | grep -v "\.[a-z0-9]\+\.vrlp$" # 方式2:直接正则匹配基础文件 find db/test/vs -type f -regex ".*/[^.]\+\.vrlp$"
逻辑说明
find db/test/vs -type f -name "*.vrlp":遍历目标目录下所有.vrlp类型文件grep -v "\.[a-z0-9]\+\.vrlp$":反向匹配排除文件名最后一个.前包含小写字母/数字后缀的文件(如xxx.ce.template.a.vrlp会被排除)- 正则版本
-regex ".*/[^.]\+\.vrlp$":直接匹配路径最后一段为「无点字符+.vrlp」的文件,精准锁定基础文件
二、原Shell提取TEST_CASE与CLASS的命令功能解析
假设原Shell命令为以下常见实现:
提取TEST_CASE的命令
# 方式1:rev+cut组合 TEST_CASE=$(echo "$file_path" | rev | cut -d'.' -f2 | rev) # 方式2:sed正则匹配 TEST_CASE=$(echo "$file_path" | sed -E 's/.*\/([^.]+)\.vrlp/\1/')
提取CLASS的命令
CLASS=$(echo "$file_path" | rev | cut -d'/' -f2 | rev)
功能拆解
TEST_CASE提取
- rev+cut组合:先反转字符串,以
.为分隔符取第2个字段,再反转回来,最终得到.vrlp前的文件名主体(如db/test/vs/LoginTest.vrlp提取出LoginTest) - sed正则:匹配路径中最后一段
/后的内容,捕获.vrlp前的部分,直接提取文件名主体
- rev+cut组合:先反转字符串,以
CLASS提取
- rev+cut组合:先反转字符串,以
/为分隔符取第2个字段,再反转回来,最终得到文件所在的父目录名(如db/test/vs/LoginTest.vrlp提取出vs)
- rev+cut组合:先反转字符串,以
三、Python实现对应逻辑
1. 过滤基础.vrlp文件
import os target_dir = "db/test/vs" base_vrlp_files = [] # 遍历目录筛选符合条件的文件 for root, _, files in os.walk(target_dir): for file in files: if file.endswith(".vrlp") and "." not in file[:-5]: # file[:-5] 去掉末尾的.vrlp,检查剩余部分无点号,确保是基础文件 base_vrlp_files.append(os.path.join(root, file)) # 输出结果 for f in base_vrlp_files: print(f)
2. 提取TEST_CASE与CLASS
def extract_test_info(file_path): # 提取TEST_CASE:去掉.vrlp后缀的文件名主体 file_name = os.path.basename(file_path) test_case = os.path.splitext(file_name)[0] # 提取CLASS:文件所在的父目录名 class_name = os.path.basename(os.path.dirname(file_path)) return test_case, class_name # 示例调用 for f in base_vrlp_files: tc, cls = extract_test_info(f) print(f"TEST_CASE: {tc}, CLASS: {cls}")
逻辑说明
- 过滤部分:通过
file.endswith(".vrlp")锁定目标文件,file[:-5]移除后缀后检查无点号,排除带变体后缀的文件 - TEST_CASE提取:用
os.path.splitext直接分割文件名与后缀,简洁获取主体部分 - CLASS提取:用
os.path.dirname获取文件所在目录,再用os.path.basename取目录名,完全对应原Shell的父目录提取逻辑
内容的提问来源于stack exchange,提问作者Hirai
相关产品推荐
相关产品推荐

