find 命令似乎不适用于文件名范围

find 命令似乎不适用于文件名范围
> ls
    chr10_canu.fasta  chr11.fasta      chr2_canu.fasta  chr3.fasta       chr5_canu.fasta  chr6.fasta       chr8_canu.fasta  chr9.fasta
    chr10.fasta       chr1_canu.fasta  chr2.fasta       chr4_canu.fasta  chr5.fasta       chr7_canu.fasta  chr8.fasta       circoletto_pbs.sh
    chr11_canu.fasta  chr1.fasta       chr3_canu.fasta  chr4.fasta       chr6_canu.fasta  chr7.fasta       chr9_canu.fasta
> find . -name "chr{1..11}.fasta"

为什么该find命令找不到任何内容?

答案1

使用find-regex选项来查找带有数字后缀的文件名 from 1to 11

find . -type f -regex ".*/chr\([1-9]\|1[01]\)\.fasta"

-regex 图案
文件名与正则表达式匹配图案。这是整个路径的匹配,而不是搜索。

答案2

before{1..3}after是一个 zsh 大括号扩展运算符(现在也被其他一些 shell 支持)当没有引用时扩展为多个参数:before1after, before2afterbefore3after然后传递给命令。

当您引用它时,{1..11}是 left asis,并且find-name通配符匹配运算符不会{1..11}特殊对待这些,因此它只是查找字面名称为 的文件chr{1..11}.fasta

即使您不加引号,find也不知道该怎么办:

find . -name chr1.fasta chr2.fasta...

为了让它有用,它必须是:

find . \( -name chr1.fast  -o -name chr2.fasta... \)

并且您不能{x..y}直接使用运算符来实现这一点。

在这种情况下,您可以这样做:

find . \( -name 'chr[1-9].fast -o -name 'chr1[01].fasta' \) ...

或者等效的正则表达式(如果您的find实现支持它们)。

或者您可以使用zsh的高级递归通配符:

printf '%s\n' **/chr<1-11>.fasta

它也将匹配chr01.fastachr011.fasta,为您提供排序列表并跳过隐藏目录。

答案3

将 {} 更改为 [] 等:

find . -name '*chr[1-11].fasta'

相关内容