在 bash 中匹配符号序列

在 bash 中匹配符号序列

我想在 bash 中列出所有 Fortran 90 文件,但不列出以 结尾的文件_tst.f90。到目前为止,我最好的尝试是

ls -l ../src/*[!_tst].f90

根据关于模式匹配的 Bash 参考 [!_tst]仅考虑_t和的单次出现s。是否可以告诉 bash_tst应该是一个序列?括号(_tst)、单引号'_tst'和双引号"_tst"符号不起作用。

答案1

严格回答你的问题:是的,你可以,但它不起作用。

shopt -s extglob
ls -l ../src/*!(_tst).f90

问题是它!(...)会很乐意匹配一个空字符串,所以任何文件名foo_tst.f90都只会吞掉*前七个字符。

我不知道不使用 find(1) 的 bash 原生方法可以做到这一点。

在 zsh 中:

setopt extended_glob
ls -ld ../src/*.f90~*_tst.f90

这使用了~extended_glob 特性,其A~B结果是匹配任何A不匹配的内容B

答案2

如果要查找以 f90 结尾的所有文件(以 _tst.f90 结尾的文件除外),则应使用以下命令:

find /spath/to/start/directory -name '*.f90' ! -name '*_tst.f90' -print

编辑:这会遍历整个树。如果你想将自己限制在当前目录中,

find /spath/to/start/directory -name '*.f90' ! -name '*_tst.f90' -maxdepth 1 -print

答案3

这是路径的扩展shopt -s extglob

shopt -s extglob
ls -l ../src/!(!(*.f90)|*_tst.f90)

这告诉 Bash 匹配任何符合以下条件的内容不是匹配以下任一项:

  • 不是 *.f90,即除了.f90文件或

  • _tst.f90,即您的测试文件。

匹配仅有的文件*.f90除了 *_tst.f90

它很快变得复杂,并且find在我看来,它是复杂文件匹配的更具可扩展的解决方案,但是如果您只想要 Bash,则可以实现类似的构造。

相关内容