प्रत्येक उप-निर्देशिकाओं में फ़ाइलों की गणना


22

मैं एक निर्देशिका के प्रत्येक उपनिर्देशिका में फाइलों की गिनती को सूचीबद्ध करने के लिए एक BASH कमांड चाहूंगा।

निर्देशिका में उदाहरण के लिए /tmpवहाँ रहे हैं dir1, dir2... मैं देखना चाहते हैं:

`dir1` : x files 
`dir2` : x files ...

जवाबों:


34

यह मानते हुए कि आप केवल फाइलों की पुनरावर्ती गिनती चाहते हैं, निर्देशिकाओं और अन्य प्रकारों की नहीं, ऐसा कुछ काम करना चाहिए:

find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
  printf "%-25.25s : " "$dir"
  find "$dir" -type f | wc -l
done

इसके अलावा, मुझे "खोज: चेतावनी: एक गैर-विकल्प तर्क-प्रचार के बाद -maxdepth विकल्प निर्दिष्ट किया गया है, लेकिन विकल्प स्थितीय नहीं हैं (-maxdepth यह निर्दिष्ट किए गए परीक्षणों के साथ-साथ इसके बाद निर्दिष्ट किए गए विकल्पों को भी प्रभावित करता है। कृपया विकल्प निर्दिष्ट करें) अन्य तर्कों से पहले। "
११:

2
अब तक दिए गए दोनों जवाबों की संभावना नहीं है कि इस मामले में गलत परिणाम आएंगे, जिसमें ऐसी फाइलें हैं जिनके नामों में नईलाइन वर्ण शामिल हैं। आप एक साथ कि संभाल कर सकते हैं find... -print0 | xargs -0....
स्कॉट

@jldupont: ments-type d I've से पहले गहराई के तर्कों को आगे बढ़ाएं, मैंने उत्तर संपादित किया है।
थॉर

हां, और मुझे यह जानकारी जोड़ने दें कि यह उत्कृष्ट समाधान कोई बाहरी चर नहीं लेगा और इस तरह से काम करेगा bash alias!!
वाक्यविन्यास

तेज़, और पाइपिंग से sort -rn -k 2,2 -t$':'आपको DESC सूची मिलती है
आंद्रे फिगएरेडो

14

इस कार्य ने मुझे इतना मोहित किया कि मैं स्वयं एक समाधान निकालना चाहता था। यह थोड़ी देर भी नहीं करता है और निष्पादन की गति में तेज हो सकता है। कहने की जरूरत नहीं है कि थोर के प्रयासों ने मुझे चीजों को विस्तार से समझने में बहुत मदद की।

तो यहाँ मेरा है:

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 कम कोड के लिए :-)
थोर

1
इससे प्रेरित; filecount द्वारा क्रमबद्ध:find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
mnagel

7
find . -type f | cut -d"/" -f2 | uniq -c

मौजूदा फ़ोल्डर में एक फ़ोल्डर और फ़ाइलों को नीचे मिली फ़ाइलों की एक सूची के साथ सूचीबद्ध करता है। त्वरित और उपयोगी IMO। (फाइलें गिनती 1 के साथ दिखती हैं)।


1
यह कैसे काम कर रहा है के बारे में थोड़ा स्पष्टीकरण? :)
C0deDaedalus

1
बहुत अच्छे धन्यवाद! आप | sort -rnफ़ाइलों की संख्या के आधार पर उप-प्रकार जोड़ना चाह सकते हैं ।
डेनिस गोलोमेज़ोव

1

खोजने का उपयोग करना निश्चित रूप से जाने का तरीका है यदि आप पुनरावर्ती रूप से गिनना चाहते हैं, लेकिन यदि आप केवल एक निश्चित सूची के तहत सीधे फाइलों की गिनती चाहते हैं:

ls dir1 | wc -l


मैं उन 1000 निर्देशिकाओं में से प्रत्येक के लिए नहीं करना चाहता जो मुझे वहां मिली हैं ...
jldupont

फिर xargs का उपयोग करें। ls -d */ | xargs -n1 ls | wc -l(आपके द्वारा स्वीकार किए गए उत्तर का उपयोग करें यदि यह पहले से ही काम करता है, हालांकि! यह सिर्फ और अब आपको पता है।)
jrajav

आपके प्रस्ताव ने कई सेकंड में कोई परिणाम नहीं दिखाया जबकि मैंने जो उत्तर स्वीकार किया था।
जुलडूपोंट

@jrajav यह दृष्टिकोण उन में व्हाट्सएप के साथ निर्देशिकाओं के लिए बिल्कुल विफल है। यह findइतना महत्वपूर्ण क्यों है। (अकेले -print0और xargs -0, पहले से ही स्कॉट द्वारा दूसरे उत्तर में बताया गया है)
वाक्यविन्यास

1
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'

मुझे अक्सर अपनी उप-निर्देशिकाओं में फ़ाइलों की संख्या गिनने और इस कमांड का उपयोग करने की आवश्यकता होती है। मैं पहले दिखने के लिए गिनती पसंद करता हूं।


0

मैं क्या उपयोग करता हूं ... यह एक पैरामीटर के रूप में आपके द्वारा दिए गए सभी उपनिर्देशिकाओं की एक सरणी बनाता है। सभी उपनिर्देशिकाओं के संसाधित होने तक उपनिर्देशिका और उसी उपनिर्देशिका की गिनती को प्रिंट करें।

#!/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

0

आप इस अजगर कोड का उपयोग कर सकते हैं। चलकर दुभाषिया को बूट करें 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.