फ़ाइलों की एक निश्चित संख्या वाली निर्देशिका खोजें


13

उम्मीद कर रहा था कि मैं findकमांड के साथ ऐसा कर पाऊंगा लेकिन मैं जो चाहता हूं उसके लिए मैनुअल में कोई टेस्ट नहीं देख सकता। मैं काम करने वाली निर्देशिका में किसी भी निर्देशिका को खोजने में सक्षम होना चाहता हूं जिसमें कम-से-अधिक, अधिक-से-अधिक या वास्तव में मेरे द्वारा निर्दिष्ट गणना शामिल है।

find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries

लेकिन अफसोस कि ऐसा कोई विकल्प नहीं है।


"ls -al | wc -l | grep" जैसा कुछ आज़माएँ
Vanadis

जवाबों:


16

आप यह कोशिश कर सकते हैं कि उप निर्देशिका नाम और उनके पास मौजूद फ़ाइलों / निर्देशिकाओं की संख्या प्राप्त करने के लिए:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

यदि आप सभी उप निर्देशिकाओं के लिए ऐसा ही करना चाहते हैं (पुनरावर्ती खोजें) इसके बजाय इसका उपयोग करें:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

उन निर्देशिकाओं का चयन करने के लिए जिनकी बिल्कुल 10 फाइलें हैं:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10 या अधिक:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'

10 या उससे कम:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'

यदि आप केवल निर्देशिका नाम रखना चाहते हैं (उदाहरण के लिए आप इसे किसी अन्य प्रक्रिया के लिए पाइप करना चाहते हैं जैसा कि @evilsoup ने सुझाव दिया है) तो आप इसका उपयोग कर सकते हैं:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'

1
मुझे लगता है कि फ़ाइल काउंट (यानी अंतिम व्हाट्सएप-सीमांकित कॉलम) को काटने के लिए awk कमांड को शामिल करना उपयोगी हो सकता है, अगर प्रश्नकर्ता आउटपुट को कुछ और करना चाहता है।
ईविल

1
@evilsoup अच्छा विचार है, किया।
टेराडॉन

निर्देशिका नामों में सफेद रिक्त स्थान और विशेष वर्णों का समर्थन करने के लिए; सिंगल और डबल कोट्स का उपयोग find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
उल्टा

3

बिल्कुल $NUM फाइलों सहित तत्काल उपनिर्देशिकाओं की सूची के लिए ।

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'

फ़ाइलों से अधिक युक्त तत्काल उपनिर्देशिका को सूचीबद्ध करने के लिए $NUM

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'

फ़ाइलों से कम युक्त तत्काल उपनिर्देशिका को सूचीबद्ध करने के लिए $NUM

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'

आइटम एक अशक्त चरित्र द्वारा समाप्त किए जाते हैं \0, इसलिए नए नाम या अन्य प्रकार के सफेद स्थान वाले फ़ाइल नाम की सही व्याख्या की जाएगी। %hप्रत्येक फ़ाइल के प्रिंट dirnameawkफिर एक सरणी का उपयोग करके यह गिनने के लिए कि यह कितनी बार प्रत्येक निर्देशिका से मिलता है, इसे प्रिंट करते हुए यदि शर्तें पूरी होती हैं।

कृपया ध्यान दें कि उपर्युक्त आदेशों में से कोई भी शून्य फ़ाइलों वाली निर्देशिकाओं को प्रदर्शित नहीं करेगा। यह भी ध्यान रखें कि फ़ाइल से मैं नियमित रूप से फ़ाइलें, की चर्चा करते हुए कर रहा हूँ नहीं लिंक, निर्देशिका, सॉकेट, ब्लॉक, नामित पाइप, आदि।

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


2

इसे इस्तेमाल करे:

[`खोजो। | wc -l` -eq 10] && गूंज "मिली"

[`खोजो। | wc -l` -gt 10] && गूंज "मिली"

[`खोजो। | wc -l` -lt 10] और& गूंज "पाया"

इस उदाहरण में आप जाँच सकते हैं कि CURRENT निर्देशिका में ठीक 10, अधिक तो 10 और फिर 10 फ़ाइलें / निर्देशिकाएँ हैं। यदि आपको निर्देशिकाओं के गुच्छा की जांच करने की आवश्यकता है, तो बस लूप का उपयोग करें।


आपका समाधान वर्तमान निर्देशिका ( .) को भी गिनता है , आप उसके अनुसार संशोधित करना चाहते हैं।
टेराडॉन

मुझे इस उत्तर का जोर पसंद है (क्योंकि मैं शेल में काम करने के लिए एक ग्लूटन हूं), लेकिन आप अनावश्यक कॉल से बचने के लिए परीक्षण के उपयोग wc -l < <(printf %s\\n ./*)या printf %s\\n ./* | wc -lअंदर से बेहतर होंगे find। यह उस समस्या को भी टाल देगा जो @terdon ने नोट की थी, .परिणाम में शामिल है। हालाँकि, यह फ़ाइलों की अनदेखी करने की समस्या से भी शुरू होगा .; मैं इसके साथ हल करूंगा shopt -s dotglob(ग्लब्स मैच फ़ाइलों को एक शुरुआत के साथ शुरू करने के लिए ., लेकिन नहीं .या ..)।
ईविल

@terdon यह महत्वपूर्ण नहीं है। यह अंतिम समाधान नहीं है, सिर्फ उदाहरण, विचार। आप अंतिम संस्करण में -1, या 10 से 11 बदल सकते हैं।
सितम्बर

मुझे पता है, और विचार अच्छा है यही कारण है कि मैंने सुझाव दिया है।
टेराडॉन

@ टेर्डन। धन्यवाद। कई अलग-अलग आवश्यकताएं हो सकती हैं, जैसे: केवल फाइलों की गणना करें लेकिन निर्देशिकाओं, या लिंक या हार्ड लिंक की नहीं। उपनिर्देशिकाओं में फ़ाइलों की गणना करें या न करें। छिपी हुई फाइलों को गिनें (जैसे .bashrc) ... ... इसलिए आपकी अभिव्यक्ति veeeeery loooong हो सकती है। :)
सितंबर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.