> 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'