নামে নির্দিষ্ট স্ট্রিং সহ ডিরেক্টরিতে ফাইল গণনা?


12

আমার কাছে নিম্নলিখিত ফাইলগুলি রয়েছে:

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

আমি snpতাদের নামের সাথে ফাইল (কেস সেনসিটিভ) শব্দ রয়েছে এমন ফাইলগুলির সংখ্যা গণনা করতে চাই । আমি ব্যবহার করার চেষ্টা করেছি

grep -a 'snp' | wc -l   

তবে আমি বুঝতে পারি যে grepফাইলগুলির মধ্যে অনুসন্ধান করে। ফাইলের নাম দিয়ে স্ক্যান করার জন্য সঠিক আদেশটি কী?


1
আপনি "কাউন্ট ফাইল" এর জন্য এই সাইটটি অনুসন্ধান করার চেষ্টা করেছেন?
don_crissti

উত্তর:


18

আপনার অর্থ কি আপনি snpফাইলের নাম অনুসন্ধান করতে চান ? এটি একটি সাধারণ শেল গ্লোব (ওয়াইল্ডকার্ড) হবে, এটি এর মতো ব্যবহৃত:

ls -dq *snp* | wc -l

-qআপনার সংস্করণটি lsএটি স্বীকৃতি না দিলে পতাকা ছাড়ুন । এটি "অদ্ভুত" অক্ষর (নিউলাইনগুলি সহ) সহ ফাইলের নামগুলি পরিচালনা করে।


নিশ্চিত ছিলাম না যে আমি lsতাদের নির্দিষ্ট পাঠ্য সহ ফাইলের নামগুলি পুনরুদ্ধার করতে ব্যবহার করতে পারি কিনা । ধন্যবাদ, ধন্যবাদ।
লুশিয়া ও

@ লুসিয়াও আপনার মন্তব্যটি পুনরায় পড়ছেন, এটি lsফাইলের নামের সাথে মিলে যায় না এটি শেল। lsপ্যাটার্নের সাথে মিলে যাওয়া ফাইলগুলির একটি তালিকা দেখেছে; এটি নিজেই প্যাটার্নটি দেখে না
রোয়াইমা

2
মনে রাখবেন আপনার যদি খুব বেশি ফাইল ফেরত আসে তবে এটি কাজ করবে না।
ডেনিস নোল্টে

4

আপনি যদি ইউনিক্স ও লিনাক্সের হলওয়েগুলিতে চুপচাপ দাঁড়িয়ে থাকেন এবং মনোযোগ সহকারে শ্রবণ করেন তবে আপনি ভুতুড়ে ভয়েস শুনতে পাবেন, করুণভাবে বিলাপ করবেন, "নতুন লাইনে থাকা ফাইল নামগুলির কী হবে?"

ls -d *snp* | wc -l

বা, সমতুল্য ,

printf "%s\n" *snp* | wc -l

সমস্ত ফাইলনাম ধারণ করে যেগুলি snpপ্রত্যেকের পরে একটি নতুন লাইন থাকে তবে আউটপুট আসবে এবং ফাইলের নামগুলিতে কোনও নতুন লাইন অন্তর্ভুক্ত করবে এবং তারপরে আউটপুটটিতে লাইন সংখ্যা গণনা করবে। যার নাম যদি কোন ফাইল থাকে

                                f o o s n p \n b a r . t s v

তাহলে সেই নামটি লেখা হবে

foosnp
bar.tsv

যা অবশ্যই দুটি লাইন হিসাবে গণনা করা হবে।

কয়েকটি বিকল্প রয়েছে যা কমপক্ষে কিছু ক্ষেত্রে আরও ভাল করে:

printf "%s\n" * | grep -c snp

যা অন্তর্ভুক্ত রেখাগুলি গণনা করে snp, তাই foosnp(\n)bar.tsvউপরের উদাহরণটি একবারে গণনা করে। এই বিষয়ে একটি সামান্য তারতম্য

ls -f | grep -c snp

উপরোক্ত দুটি আদেশের মধ্যে পৃথক:

  • এর ls -fমধ্যে এমন ফাইল অন্তর্ভুক্ত থাকবে যার নাম দিয়ে শুরু হয় .; printf … *যদি না, না dotglobশেল বিকল্প সেট করা হয়।
  • printfএটি একটি শেল বিল্টিন; lsএটি একটি বাহ্যিক আদেশ। অতএব, lsসম্ভবত সামান্য আরও সংস্থান ব্যবহার করতে পারে।
  • শেলটি যখন একটি প্রক্রিয়া করে *, এটি ফাইলের নামগুলি বাছাই করে; ls -fফাইলের নামগুলি বাছাই করে না। অতএব, lsশক্তি সামান্য কম সংস্থান ব্যবহার করতে পারে।

তবে এগুলির কিছু মিল রয়েছে: ফাইলল নেমে উপস্থিত থাকাতে তারা উভয়ই ভুল ফলাফল দেবে যার মধ্যে নিউলাইন রয়েছে এবংsnp নতুন লাইনের আগে এবং পরে উভয়ই রয়েছে

আরেকটি:

filenamelist=(*snp*)
echo ${#filenamelist[@]}

এটি এতে থাকা সমস্ত ফাইলের নাম তালিকাভুক্ত করে একটি শেল অ্যারে ভেরিয়েবল তৈরি করে snpএবং তারপরে অ্যারের উপাদানগুলির সংখ্যা রিপোর্ট করে। ফাইলের নামগুলি স্ট্রিং হিসাবে গণ্য করা হয়, লাইন নয়, সুতরাং এম্বেড করা নিউলাইনগুলি কোনও সমস্যা নয়। ডিরেক্টরিটি বিশাল হলে এই পদ্ধতির কোনও সমস্যা হতে পারে তা অনুমেয়, কারণ ফাইলনামগুলির তালিকা অবশ্যই শেল মেমরিতে রাখা উচিত।

আরেকটি:

এর আগে, যখন আমরা বলেছিলাম printf "%s\n" *snp*, printfকমান্ডটি "%s\n"প্রসারিত প্রতিটি আর্গুমেন্টের জন্য ফর্ম্যাট স্ট্রিংটি পুনরায় (পুনরায় ব্যবহৃত) করা হয়েছে *snp*। এখানে, আমরা এতে একটি ছোট পরিবর্তন করেছি:

printf "%.0s\n" *snp* | wc -l

এটি "%.0s\n"প্রসারণের প্রতিটি যুক্তির জন্য ফর্ম্যাট স্ট্রিংটি পুনরায় (পুনরায় ব্যবহার) করবে *snp*। তবে "%.0s"প্রতিটি স্ট্রিংয়ের প্রথম শূন্য অক্ষর মুদ্রণ করা - অর্থাত্ কিছুই নয়। এই printfআদেশটি snpতার নামে থাকা প্রতিটি ফাইলের জন্য কেবলমাত্র একটি নতুন লাইন (অর্থাত একটি ফাঁকা লাইন) আউটপুট দেবে ; এবং তারপর wc -lতাদের গণনা করা হবে। এবং আবারও, আপনি .সেট করে ফাইলগুলি অন্তর্ভুক্ত করতে পারেন dotglob


1

সারাংশ:

"বিজোড়" নাম (নতুন লাইন সহ) ফাইলগুলির জন্য কাজ করে।

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'

এটি একটি তারকাচিহ্ন যুক্ত করবে, এটি, যদি উদ্ধৃত না হয়, তবে ফাইলগুলির পুরো তালিকায় প্রসারিত হবে।


-1

ধরা যাক আপনি এইচটিএমএল ফাইলগুলির সংখ্যা গণনা করতে চেয়েছিলেন:

ls | grep ".html" | wc -l

সুতরাং আপনি যদি "স্ন্যাপ" এর ঘটনাগুলি গণনা করছেন:

ls | grep "snp" | wc -l
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.