विशिष्ट एक्सटेंशन के साथ विशेष निर्देशिका में फ़ाइलों की कुल संख्या की गणना करें


32

मैं विशेष निर्देशिका में कुल फ़ाइलों की गिनती करना चाहता हूं जो ".mp4" एक्सटेंशन के साथ समाप्त होती हैं।

मुझे निम्नलिखित आदेश मिल रहे हैं:

ls -F |grep -v / | wc -l

यह सभी फाइलों को विशेष निर्देशिका में गिनता है, लेकिन मैं उन फाइलों की गिनती चाहता हूं जो .mp4 एक्सटेंशन के साथ समाप्त होती हैं।

क्या इसके लिए कोई उबंटू कमांड है?


2
सरल, सही, सीधा जवाब है @ लूइस-मैथिजिसेन। ls -1न्यूलाइन वर्णों की हैंडलिंग, इस मामले में, lsआउटपुट को पार्स करने के लिए समझदार है । चिह्नित -R ध्वज के उपयोग के लिए एक गलत है।
रमनो

जवाबों:


19

यहां आप इस तरह से कर सकते हैं

ls -lR /path/to/dir/*.jpg | wc -l

इससे आपको गिनती मिलती है


5
क्यों -R? statजब आप सिर्फ नाम की जरूरत है तो एक पूर्ण क्यों कर रहे हैं ? क्यों नहीं ls -1 *.jpg| wc -l? (ठीक है, काम नहीं कर रहा है अगर आपके पास इसमें नई
कहानियों के

2
... और सवाल था "एक निर्देशिका में फ़ाइलों की संख्या की गिनती"। इसके अलावा, यह उप- श्रेणियों की सभी सामग्री को पुन: सूचीबद्ध करेगा जो नाम में .jpg , अंत में समाप्त होने वाली उपनिर्देशिकाओं में फाइल नहीं है .jpg। क्या आपने कभी इसका परीक्षण किया है?
रमनो

1
सवाल कहता है "एक विशिष्ट निर्देशिका में फाइलें", जिसका अर्थ है कि उपनिर्देशिका पुनरावृत्ति नहीं चाहता है।
डेविड रिचरबी

1
यह भी विफल रहता है अगर निर्देशिका में बहुत सारी फाइलें हैं (क्योंकि *.jpgशेल द्वारा विस्तारित किया गया है, द्वारा नहीं ls) और अगर ऐसी फाइलें हैं जिनके नाम हाइफ़न से शुरू होते हैं।
डेविड रिचेर्बी

2
@DavidRicherby यह स्किप नाम है जो इसके साथ शुरू होता है .। लेकिन यह वास्तव में नामों में हाइफ़न के साथ ठीक काम करता है, सिवाय इसके /path/to/dirकि खाली स्ट्रिंग या एक हाइफ़न के साथ एक सापेक्ष पथ है। लेकिन मैं गलत था इससे पहले कि मैंने lsपात्रों को बदल दिया ?। ऐसा तब होता है जब स्टडआउट एक टर्मिनल होता है, लेकिन यहां आउटपुट एक पाइप है, इसलिए lsफाइलनेम से सभी पात्रों को भेजता है wcइस उत्तर को गलत -qया -bझंडे के बिना उस व्यवहार को बदलने के लिए गलत बनाता है , क्योंकि फ़ाइल नाम में नई सीमाएँ हो सकती हैं। l0b0 का उत्तर इन समस्याओं से मुक्त है।
एलियाह कगन

42

दुर्भाग्य से यह सौम्य समस्या एक तरह से हल करना मुश्किल है जो सभी फ़ाइल नामों का समर्थन करती है और पोर्टेबल है। यह सुरक्षित है (यह छिपी हुई फ़ाइलें, रिक्त स्थान वाले मार्ग, डैश और यहां तक ​​कि नए सिरे से संभालता है) और POSIX संगत :

find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c

यदि आप इसे पुनरावर्ती नहीं चाहते हैं, तो बस जोड़ दें -maxdepth 1

आपको lsआउटपुट पार्स नहीं करना चाहिए ।

परीक्षा:

$ cd -- "$(mktemp -d)"
$ touch -- -foo.mp4 .bar.mp4 .bat.mp4 'baz.mp4
> ban.mp4'
$ find . -mindepth 1 -type f -name "*.mp4" -exec printf x \; | wc -c
4

स्वीकृत उत्तर की तुलना करें :

$ ls -lR ./*.mp4 | wc -l
3

या अन्य सुझाव:

$ find . -name "*.mp4" | wc -l
5
$ ls -1 *.mp4 | wc -l
ls: invalid option -- '.'
Try 'ls --help' for more information.
0
$ find . -name "*.mp4" | wc -c # Answer fixed at a later time
51
$ find . -name "*.mp4" | wc -l
5
$ find . | grep -i ".mp4$" | wc -l
5
$ ls . | grep ".mp4$" | wc -l
3

2
हालांकि यह उत्तर सही और मजबूत है, आप -printf xइसके बजाय उपयोग कर सकते हैं -exec printf x \;। यही कारण है: find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c करने के लिए कोई ज़रूरत नहीं है -execबाह्य printfआदेश है, जो अगर वहाँ कई फाइलों हो जाएगा रहे हैं बहुत धीमी गति से , क्योंकि findके लिए है कांटा (2) स्वयं की प्रतिलिपि बंद और फिर execve (2) /usr/bin/printf । इसके साथ -exec printf x \;, प्रत्येक फ़ाइल के लिए एक बार किया जाना चाहिए ।
एलियाह कगन

-printfPOSIX में समर्थित नहीं हैfind , यही वजह है कि मैंने इसका उपयोग नहीं किया।
l0b0

1
न ही हैं -mindepthऔर -maxdepth, जो आपने उपयोग किया।
एलिया कगन

अच्छी बात है, मैं उस पर नहीं उठा था!
l0b0

बीएसडी findमें शामिल है -mindepthऔर -maxdepthलेकिन इसमें शामिल नहीं है -printfइसलिए मैं दोनों को शामिल करने की सराहना करता हूं।
जोसेफ

11

यह क्रम में एक्सटेंशन द्वारा सभी फ़ाइलों को ढूँढता है, सॉर्ट करता है और सूचीबद्ध करता है:

find . -type f | sed 's/.*\.//' | sort | uniq -c

अति उत्कृष्ट! मैं बस | sort -rnअंत में जोड़ना चाहूंगा और शायद -mindepth 1अगर सिर्फ वर्तमान डायर।
पाब्लो ए

और शायद head -nशीर्ष एन पाने के लिए पाइप ।
रमन

इस तरह के एक महान जवाब, बहुत बहुत धन्यवाद
डेनिस गोलोमेज़ोव

5

मुझे लगता है कि यह निम्नलिखित आदेशों के रूप में बहुत सरल है।

$ find . -name "*.mp4" | wc -l
8

या

$ find . | grep -i ".mp4$" | wc -l
8

मुझे लगता है कि ऊपर दिए गए आदेश फाइलों और निर्देशिका नामों की गणना करते हैं *.mp4

इसलिए मेरा सुझाव है कि आप निम्नानुसार पैरामीटर के रूप में -type fविकल्प का उपयोग करें find

$ find . -name "*.mp4" -type f | wc -l
8

इसके अलावा, के ls -lRरूप में इस्तेमाल किया जा सकता हैfind .


2

आप उपयोग कर सकते हैं ls -1 *.mp4 | wc -l

यह समाप्त होने वाली सभी फ़ाइलों को सूचीबद्ध करेगा .mp4, प्रत्येक फाइल को एक नई लाइन पर प्रिंट करेगा ( ls -1 *.mp4), आउटपुट को पाइप wcकरेगा जो -lध्वज का उपयोग करके नई लाइनों की संख्या की गणना करेगा ।


यह पक्का नहीं है कि इसे क्यों हटाया गया, यह काम करता है
पैंथर

चूंकि *.mp4शेल द्वारा विस्तार किया गया है, इसलिए नहीं ls, यह विफल हो जाएगा यदि .mp4निर्देशिका में इतनी सारी फाइलें हैं कि उनमें से सूची lsको तर्क के रूप में पारित नहीं किया जा सकता है।
डेविड रिचरबी

@ रमाना इसे एक डायरेक्टरी में टेस्ट करते हैं जिसमें एक फाइल है जिसका नाम है--.mp4
डेविड रिचरबी

@DavidRicherby हाँ, आप सही हैं। --दूसरा मामला हल करेगा; पूर्व में एक त्रुटि संदेश बढ़ेगा (आपको फ़ाइलों की बहुत आवश्यकता है!) और यहां एक और अच्छा प्रश्न है। कोने के मामले, लेकिन ध्यान देने योग्य, हाँ।
रमनो

1
@ रमनो को जोड़े बिना -qया -b, यह फिल्नाम में नई कहानियों को बर्दाश्त नहीं करता है। यदि आप ls -1 *.mp4अपने टर्मिनल से बिना किसी पाइप के चलते हैं , तो lsइसका स्टैडआउट एक टर्मिनल है और यह प्रिंटेड एस के -qरूप में निहित है ?। लेकिन उस व्यवहार से दूर चला जाता है जब आउटपुट पाइप किया जाता है। ls -1 *.mp4 | wc -lयदि नई सीमाएँ हैं तो ओवरकॉन्‍ट। ls -1 *.mp4 | catदिखाता है wc" क्या देखता है।" (इसी तरह, -1जब स्टडआउट टर्मिनल नहीं है, तो यह निहित है , इसलिए यह वैकल्पिक है।) ls -1q -- *.mp4 | wc -lलगभग काम करता है, लेकिन शून्य के साथ नहीं।
एलियाह कगन

0

यह आपको .mp4 के साथ फ़ाइल की सूची देनी चाहिए

ls /path/to/directory | grep ".mp4$"

जब आप के साथ संयुक्त wc -lआप गिनती दे देंगे

ls /path/to/directory | grep ".mp4$" | wc -l

यदि आप उपनिर्देशिका शामिल करने के लिए खोज करना चाहते हैं

ls -lR /path/to/directory | grep ".mp4$" | wc -l

एक गिनती नहीं देता
पैंथर

जब यह मेरे साथ दियाwc -l
बैकस्लैश

grep को पाइपिंग के बिना ls का उपयोग करें और अपने उत्तर को छोटा करें। इसे अब कम से कम दो बार पोस्ट किया गया है।
पैंथर

@ bodhi.zazen ls /directory/*.mp4शेल को ग्लोब का विस्तार करने और कुछ निष्पादित करने का कारण बनता है ls /directory/file1.mp4 /directory/file2.mp4 ...यदि निर्देशिका में अधिक mp4 फाइलें होती हैं तो यह विफल हो जाएगी क्योंकि तर्क के रूप में पारित किया जा सकता है ls
डेविड रिचरबी

@DavidRicherby - यह मेरी ls कमांड नहीं है, मैं खोज का उपयोग करता हूं;)
पैंथर


0
ls | grep --count \.csv$

बदलें (.vsv आप चाहते हैं विस्तार के साथ)

स्पष्टीकरण: मुझे लगता है कि फ़ाइलों की सूची लाने के लिए एक सरल योजना है, और grep के साथ विस्तार की गणना करें। लाइन के अंत में एक्सटेंशन \.का मिलान .और मिलान $करने के लिए। यह काम करता है क्योंकि जब ls के आउटपुट को पाइप किया जाता है, तो प्रति लाइन एक फ़ाइल नाम भेजा जाता है, जिसे आप चलाकर सत्यापित कर सकते हैं:

ls | cat

1
ध्यान दें कि इसके बजाय grep --count, आप भी उपयोग कर सकते हैं grep -c
मोहसिन रज़ा

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