如何使用gawk定义.ss文件名后缀并创建对应存储目录
问题1:准确定义.ss后缀避免匹配文件名中的ss
你之前的正则写法存在两处问题:一是仅支持匹配单个字符开头的文件名,二是规则没有严格限定后缀位置。两种可靠实现方案:
- 正则匹配法:用
/\.ss$/规则,\.匹配真实点号,$锚定匹配位置在行尾,完全不会命中文件名中间出现的ss - 字符串截取法(兼容性更强,不受文件名内特殊字符影响):先判断文件名长度≥3,再截取最后3位判断是否等于
.ss
修正后的.ss文件名提取命令:
# 正则写法 gawk '/\.ss$/' filenames > ss/ss_filenames # 字符串截取写法 gawk 'length($0)>=3 && substr($0, length($0)-2) == ".ss"' filenames > ss/ss_filenames
问题2:正确触发创建ss目录
gawk没有原生mkdir函数,需要调用system()执行系统级目录创建命令,建议加上-p参数,避免目录已存在时报错。只要匹配到至少1个.ss后缀文件就触发创建的完整脚本如下:
gawk ' BEGIN { target_suffix = ".ss" has_target = 0 } length($0)>=3 && substr($0, length($0)-2) == target_suffix { print $0 has_target = 1 } END { if (has_target) { system("mkdir -p ss") } } ' filenames > ss/ss_filenames
流程优化建议
你可以直接在gawk中生成后续的文件提取命令,省去中间文件处理步骤:
gawk ' BEGIN { suffix = ".ss" img_file = "Sounddsk2.img" cmd_prefix = "a " img_file " get " } length($0)>=3 && substr($0, length($0)-2) == suffix { # 生成提取命令输出到脚本,核对后可直接执行 print cmd_prefix $0 " ss/" $0 } END { if (NR > 0) system("mkdir -p ss") } ' filenames > extract_ss.sh # 执行提取操作 chmod +x extract_ss.sh && ./extract_ss.sh
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

