> 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 1
to 11
:
find . -type f -regex ".*/chr\([1-9]\|1[01]\)\.fasta"
-regex
圖案
檔案名稱與正規表示式匹配圖案。這是整個路徑的匹配,而不是搜尋。
答案2
before{1..3}after
是一個 zsh 大括號擴充運算子(現在也被其他一些 shell 支援)當沒有引用時擴展為多個參數:before1after
, before2after
,before3after
然後傳遞給指令。
當您引用它時,{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.fasta
或chr011.fasta
,為您提供排序列表並跳過隱藏目錄。
答案3
將 {} 改為 [] 等:
find . -name '*chr[1-11].fasta'