> 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"
Por que o find
comando não encontra nada?
Responder1
Usarfind
A -regex
opção de encontrar os nomes de arquivos com sufixo numérico de 1
para 11
:
find . -type f -regex ".*/chr\([1-9]\|1[01]\)\.fasta"
-regex
padrão
O nome do arquivo corresponde à expressão regularpadrão. Esta é uma correspondência em todo o caminho, não uma pesquisa.
Responder2
before{1..3}after
é um operador de expansão de chave zsh (agora também suportado por alguns outros shells) quequando não citadose expande para vários argumentos: before1after
, before2after
, before3after
que são então passados para o comando.
Como você está citando, o {1..11}
é deixado como está, e find
o -name
operador de correspondência de caracteres curinga não os trata {1..11}
especialmente, então apenas procura por arquivos nomeados literalmente chr{1..11}.fasta
.
Mesmo se você deixasse sem aspas, find
não saberia o que fazer com:
find . -name chr1.fasta chr2.fasta...
Para ser útil, teria que ser:
find . \( -name chr1.fast -o -name chr2.fasta... \)
e você não pode usar o {x..y}
operador para conseguir isso diretamente.
Aqui, neste caso, você poderia fazer:
find . \( -name 'chr[1-9].fast -o -name 'chr1[01].fasta' \) ...
Ou o equivalente regexp se sua find
implementação os suportar.
Ou você pode usar zsh
o globbing recursivo avançado de:
printf '%s\n' **/chr<1-11>.fasta
que também corresponderia a chr01.fasta
or chr011.fasta
, forneceria uma lista classificada e pularia os diretórios ocultos.
Responder3
Mude o {} para [] e assim:
find . -name '*chr[1-11].fasta'