Os comandos find parecem não funcionar com o intervalo de nomes de arquivos

Os comandos find parecem não funcionar com o intervalo de nomes de arquivos
> 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 findcomando não encontra nada?

Responder1

UsarfindA -regexopção de encontrar os nomes de arquivos com sufixo numérico de 1para 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, before3afterque são então passados ​​para o comando.

Como você está citando, o {1..11}é deixado como está, e findo -nameoperador 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, findnã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 findimplementação os suportar.

Ou você pode usar zsho globbing recursivo avançado de:

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

que também corresponderia a chr01.fastaor chr011.fasta, forneceria uma lista classificada e pularia os diretórios ocultos.

Responder3

Mude o {} para [] e assim:

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

informação relacionada