সারাংশ:
"বিজোড়" নাম (নতুন লাইন সহ) ফাইলগুলির জন্য কাজ করে।
set -- *snp* ; echo "$#" # change positional arguments
count=$(printf 'x%.0s' *snp*); echo "${#count}" # most shells
printf -v count 'x%.0s' *snp*; echo "${#count}" # bash
বিবরণ
যেহেতু একটি সাধারণ গ্লোব প্রতিটি ফাইলের snpনামের সাথে মিলবে তার নামের সাথে একটি সহজ echo *snp*এই ক্ষেত্রে যথেষ্ট হতে পারে, তবে সত্যিই দেখাতে যে আমি কেবল তিনটি ফাইলের সাথে মেলে তা ব্যবহার করব:
$ ls -Q *snp*
"Codigo-0275_tdim.snps.tsv" "foo * bar\tsnp baz.tsv" "S134_tdim.snps.tsv"
কেবলমাত্র সমস্যাগুলি ফাইলগুলি গণনা করা। হ্যাঁ, গ্রেপ একটি সাধারণ সমাধান এবং হ্যাঁ দিয়ে নতুন লাইন গণনা wc -lকরাও একটি সাধারণ সমাধান। নোট করুন grep -c(গণনা) সত্যিই গণনা করা হয় যে snpস্ট্রিংটি কতবার মিলছে এবং, যদি একটি ফাইলের নামে একাধিক snpস্ট্রিং থাকে তবে গণনাটি ভুল হবে।
আমরা আরও ভাল করতে পারি
একটি সহজ সমাধান অবস্থানগত আর্গুমেন্ট সেট করা:
$ set -- *snp*
$ echo "$#"
3
অবস্থানগত আর্গুমেন্টগুলি এড়ানোর জন্য আমরা প্রতিটি যুক্তি একটি অক্ষরে রূপান্তর করতে পারি এবং ফলস্বরূপ স্ট্রিংয়ের দৈর্ঘ্য মুদ্রণ করতে পারি (বেশিরভাগ শাঁসের জন্য):
$ printf 'x%.0s' *snp*
xxx
$ count=$(printf 'x%.0s' *snp*); echo "${#count}"
3
বা, ব্যাশে, সাব-শেল এড়াতে:
$ 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
এবং গ্লোব সম্প্রসারণ পরীক্ষা:
$ touch $'foo * bar\tsnp baz.tsv'
এটি একটি তারকাচিহ্ন যুক্ত করবে, এটি, যদি উদ্ধৃত না হয়, তবে ফাইলগুলির পুরো তালিকায় প্রসারিত হবে।