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