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選項來尋找​​帶有數字後綴的檔案名稱 from 1to 11

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

-regex 圖案
檔案名稱與正規表示式匹配圖案。這是整個路徑的匹配,而不是搜尋。

答案2

before{1..3}after是一個 zsh 大括號擴充運算子(現在也被其他一些 shell 支援)當沒有引用時擴展為多個參數:before1after, before2afterbefore3after然後傳遞給指令。

當您引用它時,{1..11}是 left asis,並且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'

相關內容