บทคัดย่อ:
ใช้งานได้กับไฟล์ที่มีชื่อ "คี่" (รวมถึงบรรทัดใหม่)
set -- *snp* ; echo "$#" # change positional arguments
count=$(printf 'x%.0s' *snp*); echo "${#count}" # most shells
printf -v count 'x%.0s' *snp*; echo "${#count}" # bash
ลักษณะ
เนื่องจาก glob ที่เรียบง่ายจะตรงกับชื่อไฟล์ทุกชื่อsnpในชื่อของมันecho *snp*จะง่ายพอสำหรับกรณีนี้ แต่เพื่อแสดงให้เห็นว่าจริงๆมีเพียงสามไฟล์ที่ตรงกับที่ฉันจะใช้:
$ ls -Q *snp*
"Codigo-0275_tdim.snps.tsv" "foo * bar\tsnp baz.tsv" "S134_tdim.snps.tsv"
ปัญหาเดียวที่เหลืออยู่คือการนับไฟล์ ใช่ grep เป็นคำตอบปกติและใช่การนับบรรทัดใหม่ด้วยwc -lเป็นวิธีแก้ปัญหาปกติ โปรดทราบว่าgrep -c(นับ) นับจำนวนจริง ๆ ที่snpจับคู่สตริงและถ้าชื่อไฟล์หนึ่งชื่อมีมากกว่าหนึ่งsnpสตริงในชื่อการนับจะไม่ถูกต้อง
เราทำได้ดีกว่า
ทางออกหนึ่งที่ง่ายคือการตั้งค่าอาร์กิวเมนต์ตำแหน่ง:
$ set -- *snp*
$ echo "$#"
3
เพื่อหลีกเลี่ยงการเปลี่ยนอาร์กิวเมนต์ตำแหน่งเราสามารถเปลี่ยนอาร์กิวเมนต์แต่ละตัวให้เป็นอักขระหนึ่งตัวและพิมพ์ความยาวของสตริงผลลัพธ์ (สำหรับเชลล์ส่วนใหญ่):
$ printf 'x%.0s' *snp*
xxx
$ count=$(printf 'x%.0s' *snp*); echo "${#count}"
3
หรือในทุบตีเพื่อหลีกเลี่ยงการ subshell:
$ printf -v count 'x%.0s' *snp*; echo "${#count}"
3
รายการไฟล์
รายชื่อไฟล์ (จากคำถามเดิมที่มีหนึ่งไฟล์ที่เพิ่มบรรทัดใหม่):
a='
Codigo-0275_tdim.matches.tsv
Codigo-0275_tdim.snps.tsv
FloragenexTdim_haplotypes_SNp3filter17_single.tsv
FloragenexTdim_haplotypes_SNp3filter17.tsv
FloragenexTdim_SNP3Filter17.fas
S134_tdim.alleles.tsv
S134_tdim.snps.tsv
S134_tdim.tags.tsv'
$ touch $a
touch $'foosnp\nbar.tsv'
ที่จะมีไฟล์หนึ่งบรรทัดขึ้นบรรทัดใหม่ตรงกลาง:
f o o
s n p \n
b a r
. t s v
และเพื่อทดสอบการขยายตัวของ glob:
$ touch $'foo * bar\tsnp baz.tsv'
ที่จะเพิ่มเครื่องหมายดอกจันหากไม่ได้อ้างอิงจะขยายไปยังรายการไฟล์ทั้งหมด