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数字の接尾辞を持つファイル名を検索するオプション:111

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

-regex パターン
ファイル名が正規表現に一致するパターンこれは検索ではなく、パス全体の一致です。

答え2

before{1..3}afterzshの括弧展開演算子(現在は他のシェルでもサポートされています)で、引用されていない場合before1afterは、いくつかの引数 、 に展開されbefore2afterbefore3afterコマンドに渡されます。

引用符で囲むと、 は{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.fastachr011.fastaソートされたリストを生成し、隠しディレクトリをスキップします。

答え3

{} を [] に変更します。

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

関連情報