ডিরেক্টরিতে ফাইল সংখ্যা গণনা করার সেরা উপায় কী?


11

যদি আউটপুটটিকে পার্সিং lsকরা বিপজ্জনক হয় কারণ এটি কিছু মজাদার অক্ষর (স্পেস \n,, ...) ভাঙতে পারে তবে কোনও ডিরেক্টরিতে ফাইলের সংখ্যা জানার সর্বোত্তম উপায় কোনটি?

আমি সাধারণত findএই পার্সিং এড়াতে নির্ভর করি তবে একইভাবে find mydir | wc -lএকই কারণে ভঙ্গ হবে।

আমি এখনই সোলারিসে কাজ করছি, তবে আমি বিভিন্ন ইউনিসে এবং বিভিন্ন শেল যথাসম্ভব পোর্টেবল হিসাবে একটি উত্তর খুঁজছি।


3
আমি নিশ্চিত নই যে এটি একটি সদৃশ, আমি কি কিছু মিস করছি?
রাহমু

1
এটি একটি সদৃশ হতে পারে, তবে নির্দেশিত প্রশ্নের নয় of findআপনি recursively ব্যবহার ফাইলের সংখ্যা (পাবেন -maxdepth 1যদি আপনি যে চাই না। find mydir -maxdepth 1 -type f -printf \\n | wc -l, ফাইলের নাম বিশেষ অক্ষর হ্যান্ডেল করা হয় হিসাবে তারা প্রথম স্থানে মুদ্রিত না হয়।
Anthon

উত্তর:


16

এই কৌশলটি কেমন?

find . -maxdepth 1 -exec echo \; | wc -l

যেমন পোর্টেবল হিসাবে findএবং wc


5
এটি কাজ করে না (এটি n+1আমার ডেবিয়ান সিস্টেমে ফাইলগুলি প্রদর্শন করে)। এটি নিয়মিত ফাইলগুলির জন্যও ফিল্টার করে না।
ক্রিস ডাউন

4
আমি কেবল একটি জেনেরিক উদাহরণ দিয়েছি। এটি কাজ করে, তবে কীভাবে এটি কাজ করে তা নির্ভর করে আপনি কীভাবে আদেশটিকে findআপনার নির্দিষ্ট প্রয়োজনের সাথে খাপ খাইয়েছেন তার উপর । হ্যাঁ, এটির মধ্যে সমস্ত ডিরেক্টরি অন্তর্ভুক্ত রয়েছে .(যার ফলে আপনি ফলাফলটি কেন দেখেন n+1) including
rozcietrzewiacz

আমি এই কৌশলটি খুব চালাক পছন্দ করি; তবে আমি অবাক হয়েছি যে এটি করার সহজ সরল কোনও উপায় নেই!
রাহমু

3
@ ক্রিসডাউন ওপ নিয়মিত ফাইলগুলির জন্য ফিল্টারিং নির্দিষ্ট করে না, ডিরেক্টরিতে ফাইলের সংখ্যা জিজ্ঞাসা করে। এন +1 ইস্যু থেকে মুক্তি পেতে, ব্যবহার করুন find . -maxdepth 1 ! -name . -exec echo \; | wc -l; কিছু পুরোনো সংস্করণগুলি findহবে না -not
আর্জেজ

3
নোট করুন যে -maxdepthস্ট্যান্ডার্ড নয় (একটি GNU এক্সটেনশন এখন কয়েকটি অন্যান্য বাস্তবায়ন দ্বারা সমর্থিত)।
স্টাফেন চ্যাজেলাস

11

বাহ্যিক ইউটিলিটি, বা লুপ ছাড়া বাশ সহ:

shopt -s dotglob
files=(*)
echo ${#files[@]}

Ksh সালে প্রতিস্থাপন shopt -s dotglobদ্বারা FIGNORE=.?(.)। Zsh এ, এটি দ্বারা প্রতিস্থাপন করুন setopt glob_dots, বা shoptকল এবং ব্যবহার সরিয়ে দিন files=(*(D))। (অথবা আপনি যদি ডট ফাইলগুলি অন্তর্ভুক্ত না করতে চান তবে কেবল লাইনটি ফেলে দিন)

set -- *
echo $#

আপনি যদি ডট ফাইলগুলি অন্তর্ভুক্ত করতে চান:

set -- *
if [ -e "$1" ]; then c=$#; else c=0; fi
set .[!.]*
if [ -e "$1" ]; then c=$((c+$#)); fi
set ..?*
if [ -e "$1" ]; then c=$((c+$#)); fi
echo $c

2
সক্ষম নয় 1যখন খালি ডিরেক্টরিতে প্রথম উদাহরণ মুদ্রণ করে nullglob। Zsh এ, ( ) যোগ্যতার a=(*(DN));echo ${#a}সাথে খালি ডিরেক্টরিতে ত্রুটি হয় না। Nnullglob
নিসেতামা

8
find . ! -name . -prune -print | grep -c /

80-এর দশকের পরবর্তী সিস্টেমে মোটামুটি পোর্টেবল হওয়া উচিত।

এটি বর্তমান ডিরেক্টরি ছাড়া .এবং সমস্ত ডিরেক্টরি এন্ট্রি গণনা করে ..

উপ-ডিরেক্টরিতেও ফাইলগুলি গণনা করতে:

find .//. ! -name . | grep -c //

(এটি ইউনিক্স ভি ((1975) তেও বহনযোগ্য হতে হবে, যেহেতু এটির দরকার নেই -prune)


এই পৃষ্ঠায় বিরল পোর্টেবল উত্তরগুলির মধ্যে একটি, যদি একমাত্র না হয়।
xhienne

আমি গতকাল এই উত্তরটিকে উজ্জীবিত করেছি কারণ আমি দেখতে পেয়েছি এটি বর্তমান ডিরেক্টরি ( find dirname ! -name dirname -prune -print) ছাড়া অন্যান্য ডিরেক্টরিতেও ভাল কাজ করে । আমি তখন থেকেই ভাবছিলাম যে এর grep -c /পরিবর্তে ব্যবহার করার কোনও বিশেষ কারণ আছে wc -l(যা সম্ভবত গণনার ক্ষেত্রে বেশি ব্যবহৃত হয়)।
অ্যান্টনি জিওঘেগেন

1
find dirname ! -name dirnameএর মধ্যে অন্য ডিরেক্টরি থাকলেও এটি কাজ করে না dirname। এটি ব্যবহার করা ভাল find dirname/. ! -name .wc -lরেখার সংখ্যা গণনা করে, ফাইলের নাম বিভিন্ন লাইন দিয়ে তৈরি করা যেতে পারে কারণ ফাইলের নামের ক্ষেত্রে নতুন লাইনের চরিত্রটি বৈধ হয়।
স্টাফেন চেজেলাস

6

চেষ্টা করুন:

ls -b1A | wc -l

এতে -bমুদ্রণযোগ্য অক্ষর থাকবে, -Aসমস্ত লাইন ব্যতীত .এবং ..প্রতি লাইনে একটি প্রদর্শন করবে (পাইপের উপর ডিফল্ট, তবে স্পষ্ট করে বলা ভাল)।

যতক্ষণ না আমরা উচ্চ-স্তরের স্ক্রিপ্টিং ভাষাগুলি অন্তর্ভুক্ত করছি, পাইথনে এখানে একটি ওয়ান-লাইনার রয়েছে:

python -c 'import os; print len(os.listdir(os.sep))'

অথবা পূর্ণ 'সন্ধান' সহ:

python -c 'import os; print len([j for i in os.walk(os.sep) for j in i[1]+i[2]])'

1

Yoc এই ধরনের নির্মাণ ব্যবহার করতে পারেন:

I=0; for i in * ; do ((I++)); done ; echo $I

তবে আমি ভীত, আপনার Argument list too long.ডিরেক্টরিতে খুব বেশি ফাইল থাকলে আপনি ত্রুটিটি চিহ্নিত করতে পারেন। তবে আমি এটি 10 ​​বিলিয়ন ফাইল দিয়ে ডিরেক্টরিতে পরীক্ষা করেছি এবং এটি ভাল কাজ করেছে।


3
এটি লুকানো ফাইলগুলির জন্য কাজ করবে না যদি না শেলটি সেগুলির সাথে প্রসারিত করার জন্য কনফিগার করা থাকে *
লেকেনস্টেইন

gnu find . -maxdepth 1 -type f | wc -l
নিখিল মুলি

4
@ রাশ: এই আদেশটি "আরগ তালিকা খুব দীর্ঘ নয়" উত্থাপন করা উচিত। যে শুধুমাত্র যাতে কখনো বাহ্যিক আদেশের সঙ্গে ঘটে ( for
enzotib

1

আপনি কি পার্ল বিবেচনা করেছেন, যা তুলনামূলকভাবে বহনযোগ্য হতে হবে?

কিছুটা এইরকম:

use File::Find;

$counter = 0;

sub wanted { 
  -f && ++$counter
}

find(\&wanted, @directories_to_search);
print "$counter\n";

0

এটি ব্যবহার করে> l সহ -i (নোড নম্বর জন্য) এবং & এফ ('/' বিকল্পের সাথে ডিরেক্টরি নাম যুক্ত করা হয়) ব্যবহার করে দেখুন।

ls -ilF | egrep -v '/' | wc -l

0

একটি perlওয়ান-লাইনার সহ (পাঠযোগ্যতার জন্য পুনরায় ফর্ম্যাট করা):

perl -e 'opendir($dh, ".");
         while ( readdir($dh) ) {$count++};
         closedir $dh;
         print "$count\n";'

অথবা

perl -e 'opendir($dh, ".");
         @files = readdir($dh);
         closedir $dh;
         print $#files+1,"\n";'

আপনি ব্যবহার করতে পারেন perlফাংশন পরিবর্তন অ্যারে চাই যে grepবা mapদ্বিতীয় সংস্করণ সহ। perldoc -f readdirব্যবহার করে একটি উদাহরণ দেখুন grep


0

আমি সর্বদা সবচেয়ে সাধারণ সংস্করণ ব্যবহার করি এবং এর সাথে কখনই সমস্যা হয় নি: ls -b1 | wc -l


যদি ফাইলের \nনামটিতে একটি বা অন্যান্য মজাদার অক্ষর থাকে (তবে হ্যাঁ, কিছু নির্দিষ্ট ইউনিট এটির অনুমতি দেয়) আপনি সমস্যার মধ্যে পড়তে পারেন ।
রাহমু

1
আমার উত্তর পোস্ট করার আগে আমি স্পষ্টভাবে এটি চেষ্টা করেছি এবং এতে কোনও সমস্যা নেই। এটি চেষ্টা করার জন্য আমি কোনও ফাইলের নাম পরিবর্তন করতে নটিলাস ফাইল ম্যানেজার ব্যবহার করেছি। N এটি চেষ্টা করার জন্য।
পিটার

আপনি ঠিক বলেছেন এটি এর মতো কাজ করে না। আমি প্রথমে এটি পরীক্ষা করার সময় আমি কী করেছি তা আমি জানি না। আবার চেষ্টা করেছি এবং আমার উত্তর আপডেট করেছি।
পিটার

না, কমান্ডটি ঠিক আছে, তবে ইতিমধ্যে একই রকম সমাধান রয়েছে এবং লুকানো ফাইলগুলি গণনা করা হয়নি।
xhienne

0

findস্টাফেনের প্রস্তাবিত ভিত্তিক উত্তর ছাড়াও , এখানে ভিত্তি করে একটি পসিক্স-সম্মতিযুক্ত উত্তর ls:

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