我想在 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,则可以实现类似的构造。