Команды 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для поиска имен файлов с числовым суффиксом от 1до 11:

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

-regex шаблон
Имя файла соответствует регулярному выражениюшаблон. Это совпадение по всему пути, а не поиск.

решение2

before{1..3}after— оператор раскрытия фигурных скобок zsh (теперь поддерживается и некоторыми другими оболочками), которыйкогда не цитируетсярасширяется до нескольких аргументов: before1after, before2after, before3afterкоторые затем передаются команде.

Поскольку вы цитируете его, то {1..11}остается как есть, а оператор сопоставления подстановочных 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'

Связанный контент