> 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 1
to 11
:
find . -type f -regex ".*/chr\([1-9]\|1[01]\)\.fasta"
-regex
图案
文件名与正则表达式匹配图案。这是整个路径的匹配,而不是搜索。
答案2
before{1..3}after
是一个 zsh 大括号扩展运算符(现在也被其他一些 shell 支持)当没有引用时扩展为多个参数:before1after
, before2after
,before3after
然后传递给命令。
当您引用它时,{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.fasta
或chr011.fasta
,为您提供排序列表并跳过隐藏目录。
答案3
将 {} 更改为 [] 等:
find . -name '*chr[1-11].fasta'