উত্তর:
ধরে নিই যে আপনি কেবল ফাইলের ডিরেক্টরি এবং অন্যান্য ধরণের ক্ষেত্রেই পুনরাবৃত্ত গণনা চান, এর মতো কিছু কাজ করা উচিত:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
printf "%-25.25s : " "$dir"
find "$dir" -type f | wc -l
done
find
... -print0 | xargs -0
....
bash
alias
!!
sort -rn -k 2,2 -t$':'
আপনি ডিইএসসি তালিকা পান
এই কাজটি আমাকে এতটাই মুগ্ধ করেছিল যে আমি নিজেই একটি সমাধান বের করতে চেয়েছিলাম। এমনকি এটি লুপ এবং মায় কিছু সময় নেয় না দ্রুত সঞ্চালনের গতি হতে। বলা বাহুল্য, থোরের প্রচেষ্টা আমাকে বিষয়গুলি বিস্তারিতভাবে বুঝতে সাহায্য করেছে।
সুতরাং এখানে আমার:
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;
এটি কোনও কারণে পরিমিত দেখায় কারণ এটি দেখতে এটির চেয়ে আরও শক্তিশালী। :-)
তবে, আপনার .bash_aliases
ফাইলটিতে এটি অন্তর্ভুক্ত করার পরিকল্পনা করা উচিত, এটি অবশ্যই দেখতে হবে:
alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'
নেস্টেড একক উদ্ধৃতিগুলির মধ্যে খুব কৌতুকপূর্ণ হ্যান্ডলিং নোট করুন । এবং না, যুক্তির জন্য ডাবল উদ্ধৃতি ব্যবহার করা সম্ভব নয়sh -c
।
strace -fc script
। আপনার সংস্করণ প্রায় 70% আরও বেশি সিস্টেম কল করে। খাটো কোড :-) +1 টি
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
find . -type f | cut -d"/" -f2 | uniq -c
নীচে পাওয়া ফাইলগুলির একটি গণনা সহ বর্তমান ফোল্ডারে একটি ফোল্ডার এবং ফাইলগুলি তালিকাবদ্ধ করে। দ্রুত এবং দরকারী আইএমও। (ফাইলগুলি গণনা 1 দিয়ে দেখায়)।
| sort -rn
ফাইলের সংখ্যা অনুসারে সাবডিয়ারগুলি বাছাই করতে চাইবেন।
আপনি যদি পুনরাবৃত্তভাবে গণনা করতে চান তবে সন্ধানের ব্যবহারটি অবশ্যই নিশ্চিতভাবেই চলতে পারে তবে আপনি যদি কেবল একটি নির্দিষ্ট ডিরেক্টরিতে কেবল ফাইলের একটি গণনা চান:
ls dir1 | wc -l
ls -d */ | xargs -n1 ls | wc -l
(আপনি যদি উত্তরটি ইতিমধ্যে কার্যকর হয় তবে এটি ব্যবহার করুন, যদিও এটি ঠিক এবং এখন আপনি জানেন))
find
এটি এত গুরুত্বপূর্ণ। (একা থাকুন -print0
এবং xargs -0
অন্যান্য জবাব ইতিমধ্যে স্কট দ্বারা নির্দেশিত)
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'
আমার প্রায়শই আমার সাব ডিরেক্টরি ডিরেক্টরিতে ফাইল সংখ্যা গণনা এবং এই কমান্ডটি ব্যবহার করা প্রয়োজন। আমি গণনাটিকে প্রথমে উপস্থিত হতে পছন্দ করি।
আমি যা ব্যবহার করি ... এটি প্যারামিটার হিসাবে আপনি যা দিয়েছেন তার মধ্যে সমস্ত উপ-ডিরেক্টরিগুলির একটি অ্যারে তৈরি করে। সমস্ত উপ-ডিরেক্টরি প্রক্রিয়া না করা পর্যন্ত সাব-ডাইরেক্টরি এবং সেই একই উপ-ডিরেক্টরিটির গণনা মুদ্রণ করুন।
#!/bin/bash
directories=($(/bin/ls -l $1 | /bin/grep "^d" | /usr/bin/awk -F" " '{print $9}'))
for item in ${directories[*]}
do
if [ -d "$1$item" ]; then
echo "$1$item"
/bin/ls $1$item | /usr/bin/wc -l
fi
done
আপনি এই অজগর কোডটি ব্যবহার করতে পারেন। দম্পতি চালনা করে এটি চালিয়ে দিন python3
:
folder_path = '.'
import os, glob
for folder in sorted(glob.glob('{}/*'.format(folder_path))):
print('{:}: {:>8,}'.format(os.path.split(folder)[-1], len(glob.glob('{}/*'.format(folder)))))
বা নেস্টেড গণনাগুলির জন্য একটি পুনরাবৃত্ত সংস্করণ:
import os, glob
def nested_count(folder_path, level=0):
for folder in sorted(glob.glob('{}/'.format(os.path.join(folder_path, '*')))):
print('{:}{:}: {:,}'.format(' '*level, os.path.split(os.path.split(folder)[-2])[-1], len(glob.glob(os.path.join(folder, '*')))))
nested_count(folder, level+1)
nested_count('.')
উদাহরণ আউটপুট:
>>> figures: 5
>>> misc: 1
>>> notebooks: 5
>>> archive: 65
>>> html: 12
>>> py: 12
>>> src: 14
>>> reports: 1
>>> content: 6
>>> src: 1
>>> html_download: 1