जवाबों:
यह मानते हुए कि आप केवल फाइलों की पुनरावर्ती गिनती चाहते हैं, निर्देशिकाओं और अन्य प्रकारों की नहीं, ऐसा कुछ काम करना चाहिए:
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$':'
आपको DESC सूची मिलती है
इस कार्य ने मुझे इतना मोहित किया कि मैं स्वयं एक समाधान निकालना चाहता था। यह थोड़ी देर भी नहीं करता है और निष्पादन की गति में तेज हो सकता है। कहने की जरूरत नहीं है कि थोर के प्रयासों ने मुझे चीजों को विस्तार से समझने में बहुत मदद की।
तो यहाँ मेरा है:
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
मौजूदा फ़ोल्डर में एक फ़ोल्डर और फ़ाइलों को नीचे मिली फ़ाइलों की एक सूची के साथ सूचीबद्ध करता है। त्वरित और उपयोगी IMO। (फाइलें गिनती 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