> 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 qué el find
comando no encuentra nada?
Respuesta1
Usarfind
La -regex
opción de buscar los nombres de archivos con sufijo numérico de 1
a 11
:
find . -type f -regex ".*/chr\([1-9]\|1[01]\)\.fasta"
-regex
patrón
El nombre del archivo coincide con la expresión regular.patrón. Esta es una coincidencia en todo el camino, no una búsqueda.
Respuesta2
before{1..3}after
es un operador de expansión de llaves zsh (ahora también compatible con algunos otros shells) quecuando no se citase expande a varios argumentos: before1after
, before2after
, before3after
que luego se pasan al comando.
Como lo estás citando, {1..11}
se deja así y el operador de coincidencia find
de -name
comodines no los trata {1..11}
de manera especial, por lo que solo busca archivos con nombres literales chr{1..11}.fasta
.
Incluso si lo dejaras sin comillas, find
no sabrías qué hacer con:
find . -name chr1.fasta chr2.fasta...
Para que sea útil tendría que ser:
find . \( -name chr1.fast -o -name chr2.fasta... \)
y no puedes usar el {x..y}
operador para lograrlo directamente.
Aquí, en este caso, podrías hacer:
find . \( -name 'chr[1-9].fast -o -name 'chr1[01].fasta' \) ...
O el equivalente de expresiones regulares si su find
implementación los admite.
O podrías usar zsh
el globbing recursivo avanzado de :
printf '%s\n' **/chr<1-11>.fasta
que también coincidiría con chr01.fasta
o chr011.fasta
, le brindará una lista ordenada y omitirá directorios ocultos.
Respuesta3
Cambie {} a [] y así:
find . -name '*chr[1-11].fasta'