कैसे मैं निर्देशिका के माध्यम से पुनरावर्ती सभी फाइलों को गिनता हूं


47

मैं यह देखना चाहता हूं कि सिस्टम में सभी इनोड उपयोग कहां हैं, यह पता लगाने के लिए उपनिर्देशिकाओं में कितनी फाइलें हैं। की तरह मैं अंतरिक्ष उपयोग के लिए यह करना होगा

du -sh /*

जो मुझे निर्देशिका को रूट से दूर उपयोग करने के लिए जगह देगा, लेकिन इस मामले में मुझे फाइलों की संख्या चाहिए, आकार नहीं।



मुझे लगता है कि "उपनिर्देशिकाओं में कितनी फाइलें उपनिर्देशिका में हैं" एक भ्रामक निर्माण है। यदि आप चाहते हैं कि अधिक स्पष्ट रूप से बताएं, तो आपको एक जवाब मिल सकता है जो बिल में फिट बैठता है।
स्टीवन डी

@Steven इसे फिर से लिखने के लिए स्वतंत्र महसूस कर रहा है ... मैंने सोचा कि मेरे उदाहरण du -sh /*ने यह स्पष्ट कर दिया कि मैं कैसे काम करना चाहता था। एक ही बात, बस फाइलों को गिनें बाइट्स नहीं।
एक्सनोटेरासाइड

जैसा कि आप इनोड के उपयोग का उल्लेख करते हैं, मुझे समझ में नहीं आता है कि क्या आप फ़ाइलों की संख्या या प्रयुक्त इनोड की संख्या को गिनना चाहते हैं। जब फाइल सिस्टम में हार्ड लिंक मौजूद होते हैं तो दोनों अलग-अलग होते हैं। अधिकांश, यदि सभी नहीं, तो उत्तर फाइलों की संख्या देते हैं। Apple टाइम मशीन बैकअप डिस्क पर उनका उपयोग न करें।
मौविसील

@mouviciel का उपयोग बैकअप डिस्क पर नहीं किया जा रहा है, और हां मुझे लगता है कि वे भिन्न हो सकते हैं, लेकिन वातावरण में मैं बहुत कम हार्डलिंक हैं, तकनीकी रूप से मुझे बस इसके लिए एक अनुभव प्राप्त करने की आवश्यकता है। पता करें कि कोई व्यक्ति वहां जल रहा है या नहीं।
xenoterracide 15

जवाबों:


60
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

सुरक्षा / अनुकूलता सुधारों के लिए गिल्स और xenoterracide का धन्यवाद।

पहला भाग: find -maxdepth 1 -type dवर्तमान कार्यशील निर्देशिका में सभी निर्देशिकाओं की सूची लौटाएगा। यह करने के लिए पाइप है ...

दूसरा भाग: while read -r dir; doथोड़ी देर से शुरू होता है - जब तक कि पाइप में आने वाला समय खुला रहता है (जो कि जब तक निर्देशिकाओं की पूरी सूची नहीं भेजी जाती) तब तक, रीड कमांड अगली पंक्ति को "dir" में बदल देगा। फिर यह जारी है ...

तीसरा भाग: printf "%s:\t" "$dir";"$ dir" (जो निर्देशिका नामों में से एक को पकड़े हुए है) स्ट्रिंग को एक टैब द्वारा प्रिंट करेगा।

चौथा भाग: find "$dir -f file""$ dir" में आयोजित निर्देशिका नाम के अंदर सभी फाइलों की सूची बनाता है। यह सूची भेजी जाती है।

पाँचवाँ भाग: wc -l;उसके मानक इनपुट में भेजी जाने वाली लाइनों की संख्या को गिनता है।

अंतिम भाग: doneबस लूप को समाप्त करता है।

तो हम वर्तमान निर्देशिका में सभी निर्देशिकाओं की एक सूची प्राप्त करते हैं। उन निर्देशिकाओं में से प्रत्येक के लिए, हम इसमें सभी फाइलों की एक सूची तैयार करते हैं ताकि हम उन सभी का उपयोग करके गिन सकें wc -l। परिणाम जैसा दिखेगा:

./dir1: 234
./dir2: 11
./dir3: 2199
...

हमेशा read -rसादे के रूप में उपयोग करें readविशेष रूप से बैकस्लैश। फिर echo -en "$dir:\t"बैकस्लैश को फिर से करेगा; printf '%s:\t' "$dir"इसके बजाय एक साधारण फिक्स का उपयोग करना है। अगला, $dirहोना चाहिए "$dir"( हमेशा चर प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों का उपयोग करें )।
गिल्स का SO-

@Giles सुझावों के अनुसार संशोधितfind -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" | wc -l; done
xenoterracide

2
मैं sort -n -r -k2इस के अंत में जोड़ रहा हूं , बहुत सारी निर्देशिकाओं के लिए, ताकि मुझे पता चले कि सबसे अधिक उपयोग कहां है
xenoterracide

चौथा भाग: "$ dir" को "$ dir" में आयोजित निर्देशिका नाम के अंदर सभी फाइलों की सूची बनाता है। आप -type fइसे सूची फ़ाइलें बनाने के लिए जोड़ना भूल गए :find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Krzysztof Boduch

@ krzysiek-boduch धन्यवाद! मैंने जवाब अपडेट किया।
शॉन जे। गोफ

15

कोशिश करें find . -type f | wc -l, यह वर्तमान निर्देशिका की सभी फाइलों के साथ-साथ उपनिर्देशिकाओं की सभी फाइलों की गिनती करेगा। ध्यान दें कि सभी निर्देशिकाओं को फाइलों के रूप में नहीं गिना जाएगा, केवल साधारण फाइलें ही करती हैं।


13

यहां कुछ उपयोगी लिस्टिंग कमांड (पिछले उपयोगकर्ताओं के कोड के आधार पर री-हैड) का संकलन दिया गया है:

फ़ाइल गणना के साथ सूची फ़ोल्डर:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done

गैर-शून्य फ़ाइल गणना के साथ सूची फ़ोल्डर:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

उप-फ़ोल्डर गणना के साथ सूची फ़ोल्डर:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done

गैर-शून्य उप-फ़ोल्डर गणना के साथ सूची फ़ोल्डर:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

सूची खाली फ़ोल्डर:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

गैर-खाली फ़ोल्डरों को सामग्री गणना के साथ सूचीबद्ध करें:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

और btw .. यदि आप आइटम सूची द्वारा छांटे गए इन सूची कमांडों में से किसी का उत्पादन करना चाहते हैं .. तो कमांड को एक प्रकार से पाइप करें: "ए-लिस्ट-कमांड" | सॉर्ट-एन
डॉल्फिनड्रीम

12

प्रयत्न, कोशिश:

find /path/to/start/at -type f -print | wc -l

एक शुरुआती बिंदु के रूप में, या यदि आप वास्तव में केवल एक निर्देशिका के उपनिर्देशिका के माध्यम से पुनरावृत्ति करना चाहते हैं (और उस शीर्ष निर्देशिका निर्देशिका में फ़ाइलों को छोड़ दें)

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l

कुछ के लिए +1 | wc -l ... शब्द गणना एक ऐसा छोटा सा उपकरण है
जोहान

हाँ, लेकिन यह केवल 1 निर्देशिका करता है .... मैं एक निर्देशिका में सभी निर्देशिकाओं के लिए गिनती प्राप्त करना चाहता हूं, और मैं इसे हर बार अलग से नहीं चलाना चाहता ... बेशक मुझे लगता है कि मैं एक लूप का उपयोग कर सकता हूं ... लेकिन मैं आलसी हो रहा हूं।
एक्सनोटेरासाइड

findडिफ़ॉल्ट रूप से सभी उप निर्देशिकाओं के माध्यम से पुनरावर्ती कार्य करता है। यदि आप इसे कई स्थानों पर काम करना चाहते हैं, तो आप उन सभी को findऔर के बीच निर्दिष्ट कर सकते हैं -type
डिडियर ट्रॉसेट

वह दूसरा निश्चित रूप से काम नहीं करता है .... मैंने इसे घर पर कोशिश की। मुझे मिल गया 698035 । मुझे लगभग 6 नंबर देखने चाहिए।
xenoterracide

यह मेरे लिए काम करता है - क्या आप सुनिश्चित हैं कि आपके पास केवल 6 फाइलें हैं /home? मैं 100% आप कुछ नहीं होगा।
क्राई हैवोक

4

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

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

एक ही सबसेट की फ़ाइलों की संख्या प्राप्त करने के लिए, का उपयोग करें:

find . | wc -l

केवल उपनिर्देशिका की खोज करने वाले समाधानों के लिए, वर्तमान निर्देशिका में फ़ाइलों को ध्यान में रखे बिना, आप अन्य उत्तरों का उल्लेख कर सकते हैं।


1
अच्छा विचार खाते में कड़ी कड़ी ले रहा है। जीएनयू को यह मानते हुए, आपको कई चरणों की आवश्यकता नहीं है find -printf '%i\n' | sort -u | wc -l:। यदि आप पोर्टेबल होना चाहते हैं, तो आपको find . -exec ls -id {} + | cut …इसके बजाय आवश्यकता होगी ।
गाइल्स का SO- बुराई को रोकना '

2

ओएस एक्स 10.6 स्वीकृत उत्तर में कमांड पर चोक करता है, क्योंकि यह इसके लिए एक रास्ता निर्दिष्ट नहीं करता है find। इसके बजाय उपयोग करें:

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

2

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन मेरा मानना ​​है कि यह शुद्ध bash(या अन्य शेल जो डबल स्टार ग्लोब स्वीकार करता है) समाधान कुछ मामलों में बहुत तेज हो सकता है:

shopt -s globstar    # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done

उत्पादन:

d1/:    302
d2/:    24
d3/:    640
...

1

इसे आजमाइए:

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

यह तब तक ठीक काम करना चाहिए जब तक कि फ़ाइल नाम में नई सूचियाँ शामिल न हों।


वैसे भी पुनरावर्ती ... मैं केवल शीर्ष स्तर देखना चाहता हूं, जहां यह सब कुछ इसके नीचे स्थित है। कुल ... यह हर निर्देशिका को मुद्रित करता है।
21

@xenoterracide: -maxdepth 1पहले के तुरंत बाद जोड़ने का प्रयास करें find। यदि आप अपनी गिनती में उपनिर्देशिकाओं की संख्या को शामिल करना चाहते हैं, -type fतो अंत में हटा दें (जो कि वास्तव में ! -type dवैसे भी होना चाहिए , ताकि सभी गैर-निर्देशिका फ़ाइलों को शामिल किया गया हो)।
डेनिस विलियमसन

1

यदि आपके पास ncduस्थापित है (जब आप कुछ सफाई करना चाहते हैं, तो आपके पास होना चाहिए), बस c"चाइल्ड आइटम मायने रखता है का टॉगल प्रदर्शन" टाइप करें। और C"वस्तुओं के आधार पर छाँटें"।


1
योग्य, यह शीर्ष-स्वीकृत उत्तर होना चाहिए :)
x-yuri

0

डु --inodes

मुझे यकीन नहीं है कि क्यों कोई भी (खुद शामिल) को इसकी जानकारी नहीं थी:

du --inodes
--inodes
      list inode usage information instead of block usage

मुझे पूरा यकीन है कि यह ओपी की समस्या को हल करता है। मैंने यह जानने के लिए इसका उपयोग करना शुरू कर दिया है कि मेरे विशाल ड्राइव में सभी कबाड़ कहां है (और इसे एक पुरानी डिस्क पर लोड करना है)।

आगे की जानकारी

यदि आप पुनरावृत्ति नहीं करना चाहते हैं (जो अन्य स्थितियों में उपयोगी हो सकता है), जोड़ें

-S, --separate-dirs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.