如何使用find命令实现带可选模式的Fortran文件扩展名匹配
匹配典型Fortran扩展名文件的find正确写法
find的-name参数使用标准shell glob通配符做匹配,该规则下?的语义是必须匹配恰好1个任意字符,没有正则表达式中「匹配0次或1次(可选)」的作用。你之前写的*.[Ff][0-9Oo]?[0-9Rr]?会强制要求点号后面至少有3个字符,既无法匹配单字符的.f/.F扩展名,还可能误匹配不符合规则的无关文件。
下面提供两种可正常工作的写法:
方案1:全版本兼容写法(推荐)
使用-o(逻辑或)拼接不同长度的扩展名匹配规则,符合POSIX标准,所有版本的find都可以正常运行,不会出现兼容性问题。
如果需要严格匹配你列出的所有固定扩展名,不额外匹配其他Fortran相关后缀,直接使用如下命令即可:
find . -type f \( \ -name "*.f" -o -name "*.F" \ -o -name "*.for" -o -name "*.FOR" \ -o -name "*.f90" -o -name "*.F90" \ -o -name "*.f95" -o -name "*.F95" \ -o -name "*.f03" -o -name "*.F03" \ -o -name "*.f08" -o -name "*.F08" \ -o -name "*.f15" -o -name "*.F15" \ -o -name "*.f18" -o -name "*.F18" \ \)
参数说明:
- 命令中的
\(和\)用于对逻辑或条件做分组,避免和find默认的逻辑与规则冲突 -type f表示仅匹配普通文件,会自动过滤目录、软链接等特殊文件,不需要该限制可以直接删除- 如果你不需要严格限定后缀列表,希望覆盖所有
f/F+两位数字格式的现代Fortran扩展名,可以把多个数字后缀的匹配项简化为-name "*.[Ff][0-9][0-9]"
方案2:GNU find 简洁正则写法
如果你使用的是Linux系统默认的GNU版本find,可以通过-regex参数使用扩展正则匹配,写法更简洁,原生支持可选匹配语义:
find . -type f -regextype posix-extended -regex ".*\.[Ff]([Oo][Rr]|[0-9]{2})?$"
正则规则说明:
.*匹配文件路径前半部分的任意字符\.[Ff]匹配后缀的点号和大小写F([Oo][Rr]|[0-9]{2})?表示后缀在F/f之后的部分是可选的,匹配内容要么是大小写组合的or(对应for/FOR),要么是两位数字(对应f90、f03这类数字后缀)$匹配路径结尾,避免误匹配扩展名更长的无关文件
内容的提问来源于stack exchange,提问作者M0M0
相关产品推荐
相关产品推荐

