विंडोज कमांड प्रॉम्प्ट: वर्तमान निर्देशिका में सभी फाइलों की गिनती कैसे प्राप्त करें?


24

cmd.exeवर्तमान निर्देशिका में फ़ाइलों की संख्या ज्ञात करने के लिए आप किस कमांड का उपयोग करेंगे ?

क्या यहां कोई पॉवरशेल विकल्प है?

अपडेट : मैं बचने की उम्मीद कर रहा था dir, क्योंकि मुझे पता है कि वर्तमान निर्देशिका में 10,000+ फाइलें हैं। Cmd विंडो में एन्यूमरेशन आउटपुट से बचना चाहते थे। धन्यवाद!

जवाबों:


27

यदि आप इसे करना चाहते हैं cmd, तो निम्नलिखित इसे करने का तुच्छ तरीका है:

set count=0 & for %x in (*) do @(set /a count+=1 >nul)
echo %count%

यही कमांड लाइन मान रही है। एक बैच फ़ाइल में आप क्या करेंगे

@echo off
setlocal enableextensions
set count=0
for %%x in (*) do set /a count+=1
echo %count%
endlocal

जो चीजों को थोड़ा अच्छा करता है। आप >nulबैच में ड्रॉप कर सकते हैं , क्योंकि set /aपरिणाम को प्रदर्शित नहीं करेगा यदि बैच फ़ाइल से चलाया जाता है - यह सीधे कमांड लाइन से होता है। इसके अलावा लूप %में साइन forको दोगुना करना होगा।

मैंने काफी कुछ उदाहरण देखे हैं जहां लोग निफ्टी ट्रिक के साथ प्रयास करते हैं find /cBe बहुत उन के साथ सावधान, के रूप में विभिन्न बातें इस तोड़ सकते हैं।

साधारण गलती:

  1. find /c /vकिसी ऐसी चीज़ का उपयोग करना और खोजना जो कभी फ़ाइल नाम में शामिल नहीं होती है, जैसे कि ::। नहीं होगा। काम। मज़बूती से। जब कंसोल विंडो को रैस्टर फोंट पर सेट किया जाता है तो आप उन कैरेक्टर कॉम्बिनेशन को प्राप्त कर सकते हैं। मैं इस तरह के रूप में एक फ़ाइल के नाम में वर्ण हो सकते हैं :, ?आदि उदाहरण के लिए उनके पूर्ण-चौड़ाई वेरिएंट है, जो तब अपने सामान्य ASCII समकक्षों जो इस टूट जाएगा करने के लिए परिवर्तित हो जाएगी में। यदि आपको एक सटीक गणना की आवश्यकता है, तो यह कोशिश न करें।

  2. find /cकिसी ऐसी चीज़ का उपयोग करना और खोजने की कोशिश करना जो हमेशा फ़ाइल नाम में शामिल हो। जाहिर है डॉट ( .) एक खराब विकल्प है। एक और जवाब बताता है

    dir /a-d | find /c ":"

    जो उपयोगकर्ता के स्थान के बारे में कई बातों को मानता है, जिनमें से सभी को सच होने की गारंटी नहीं है (मैंने वहां समस्याओं का विवरण देते हुए एक टिप्पणी छोड़ दी है) और एक परिणाम बहुत अधिक देता है।

आम तौर पर, आप उस findपर उपयोग करना चाहते हैं dir /bजो सभी गैर-फ़ाइल नाम के सामान को काट देता है और इस तरह से बाड़ की त्रुटियों से बचा जाता है।

तो सुरुचिपूर्ण संस्करण होगा:

dir /b /a-d | find /c /v ""

जो पहले सभी फ़ाइल नामों को आउटपुट करेगा, एक-एक लाइन। और फिर उस आउटपुट की सभी पंक्तियों को गिनें जो खाली नहीं हैं। चूंकि फ़ाइल नाम खाली नहीं हो सकता (जब तक कि मुझे कुछ याद नहीं है, लेकिन यूनिकोड मेरे परीक्षणों के अनुसार इस यात्रा नहीं करेगा)।


1
+1 यह वही था जो मैं देख रहा था। धन्यवाद जेआर!
p.campbell

पहली पंक्ति को सभी एक पंक्ति बनाने के लिए छोटा ट्वीक: (सेट काउंट = 0 &% x in (*) do @ @ (सेट / एक गिनती + = 1> nul)) और& इको% काउंट%
जेसन मैसी

+1 के लिएdir /b /a-d | find /c /v ""
Arvo बोवेन

लाखों फ़ाइलों के होने पर यह समाधान अच्छी तरह से काम नहीं करता है। यह "हमेशा के लिए" चलता है - PS और [System.IO.Directory] :: GetFiles ($ path) का उपयोग करके "सेकंड में" चलने वाला एक बेहतर समाधान नीचे पोस्ट किया गया है। कॉन्ट
ripvlan

@ हसन, कि शायद विफल हो जाएगा क्योंकि %count%पार्स समय में विस्तारित है।
जॉय

17

पूछें और आपको प्राप्त होगा: http://technet.microsoft.com/en-us/library/ee692796.aspx

एक फ़ोल्डर में आइटम की संख्या की गिनती

खैर, आप क्या जानते हैं: ऐसा लगता है कि सूरज अंत में बाहर आ रहा है, जिसका अर्थ है कि हमारे जाने का लगभग समय है। हालांकि, इससे पहले कि, हम आपको Get-ChildItem cmdlet के साथ एक आखिरी छोटी चाल दिखाए। कभी-कभी आपको किसी फ़ोल्डर में फ़ाइलों के बारे में बहुत कुछ जानने की आवश्यकता नहीं होती है; आपको वास्तव में यह जानने की जरूरत है कि किसी विशेष फ़ोल्डर में कितनी फाइलें (यदि कोई हो) मिल सकती हैं। यहां बताया गया है कि आप किसी फ़ोल्डर में फ़ाइलों की संख्या को जल्दी से कैसे गिन सकते हैं:

(Get-ChildItem C:\Scripts).Count

हम यहां क्या कर रहे हैं? हम केवल फ़ोल्डर C: \ Scripts में पाए गए सभी आइटमों का एक संग्रह वापस करने के लिए Get-ChildItem का उपयोग कर रहे हैं; क्योंकि यह एक संग्रह है, हमें केवल इतना करना है कि गणना संपत्ति के मूल्य को प्रतिध्वनित किया जाए, जो हमें संग्रह में वस्तुओं की संख्या बताता है। कोष्ठकों के उपयोग पर ध्यान दें: हम यह सुनिश्चित करने के लिए कोष्ठक में गेट-चाइल्डइम कमांड को संलग्न करते हैं कि Windows PowerShell पहले संग्रह को पकड़ता है और उसके बाद ही उस संग्रह के लिए गणना गुण का मान वापस प्राप्त करता है।

और यकीन है, आप Get-ChildItem को कॉल करते समय एक फ़िल्टर शामिल कर सकते हैं। फ़ोल्डर C: \ Scripts में कितनी .PS1 फाइलें हैं, यह जानने की जरूरत है? ठीक है:

(Get-ChildItem C:\Scripts -filter "*.ps1").Count

FYI करें .. मैंने "पॉवरशेल काउंट फाइल्स" की गुगली की।


1
दूसरे उदाहरण के अनुसार, गणना के लिए आपको वास्तव में फाइलों को गिनने के लिए एक फिल्म को जोड़ने की आवश्यकता है
जिम बी

3
बस स्पष्ट होने के लिए (Get-ChildItem C: \ Scripts)। फ़ोल्डर में फ़ाइलों की संख्या को वापस नहीं किया जाएगा, यह एक फ़ोल्डर में OBJECTS की संख्या वापस कर देगा। फ़ाइलों को गिनने के लिए आपको एक फ़िल्टर या फ़ाइल विनिर्देश जोड़ना होगा। कोशिश करो (gci)। अपने सी के मूल से। और dir ड्राइव करें और संख्याओं के अंतर को देखें
Jim B

4
उसी कड़ी से, यदि आप सबफ़ोल्डर्स में फ़ाइलों की गिनती करना चाहते हैं, तो भी उपयोग करें:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto

1
अगर वहाँ वास्तव में एक फ़ाइल नहीं काम करता है, कुछ इस तरह करना है: $ filecount = @ (मिल-childitem $ निर्देशिका -Filter " ") .Count। अगर मैं कहीं और पढ़ता हूं, तो यह एक सरणी नहीं है अगर एक फ़ाइल है।
नीलवैल्ट्स

@ नीलवैलर्स: यह PowerShell v3 तक सही था। तब से कोई फर्क नहीं पड़ता।
जॉय

8
dir /a-d | find "File(s)"

इस तरह की सरल फ़ाइल संचालन के लिए पॉवरशेल का उपयोग करने के बारे में चेतावनी का एक शब्द - यह cmd.exe की तुलना में अविश्वसनीय रूप से धीमा है, विशेष रूप से नेटवर्क कनेक्शन पर या जब निर्देशिका में हजारों फाइलें हैं। अधिक जानकारी के लिए इस फोरम पोस्ट को देखें ।


यदि आपका सिस्टम अंग्रेजी से भिन्न भाषा पर है, तो आपको इससे समस्या होगी।
वाल्कू

7

dir आपको नीचे की ओर कुल फ़ाइल गणना देता है।


1
1 अप मेट, तुमने मुझे यह हरा दिया :)
dyasny

2
और सभी लाइनों को देखने की लागत से बचने के लिए cmd विंडो के माध्यम से स्क्रॉल करें ... इसे कम से कम करें, यह बहुत तेजी से काम करेगा।
gbjbaanb

1
या बस dir > file.. आह मुझे POSIX
लोरेंजोग

1
@lorenz: किसी भी कारण dir > fileसे विंडोज में काम नहीं करना चाहिए? आउटपुट पुनर्निर्देशन बिल्कुल जादू नहीं है, आप जानते हैं।
जॉय

1
@johannes: यह वास्तव में काम करता है! मुझे POSIX की याद आती है क्योंकि आप dir | grep (something)धीमी स्क्रीन पर लिखने से बचने के लिए "बस" कर सकते हैं जो चीजों को धीमा कर देता है (और इसे पूरी तरह से कम करना)।
लॉरेंजॉग

7

सबसे तेज़ तरीका जो मैंने पाया है वह पीएस कंसोल में निम्नलिखित को चलाना है।

[System.IO.Directory]::GetFiles($path).Count

जहां $ पथ एक स्थानीय पथ या UNC साझा है।


2
उस ओर देखो। सवाल पूछे जाने के लगभग 7.5 साल बाद एक वैध भयानक जवाब दिखाई दिया!
पी। काम्पबेल

मेरे लिए लगभग 10 सेकंड में गिनती वापस करने के लिए 2.1 मिलियन से अधिक फ़ाइलों के साथ एक निर्देशिका में वर्चुअल सर्वर पर काम किया। यह सुनिश्चित करने के लिए सही उत्तर होना चाहिए।
डैरेन एमबी

यह वास्तव में सबसे अच्छा जवाब है। मेरे पास 4.5 मिलियन फ़ाइलों वाला एक फ़ोल्डर था और इस विधि ने उन्हें कई सेकंड में गिना। इससे पहले कि मैं उन पर छोड़ता, अन्य प्रस्तावित उत्तरों में विधियाँ कई मिनटों तक चलती रहीं।
रिपवलन

3

बस dir / B आउटपुट से लाइनें गिनें (निर्देशिका शामिल):
dir /B | find /c /v "~~~"

केवल फाइलों की गिनती के लिए (बिना dirs के):
dir /A-D /B | find /c /v "~~~"


यह फाइल और डायरेक्टरी को कुल के रूप में
गिनता है

2

नेट पर यह पाया :

dir /a-d | find /c ":" > NUMfiles.###
set /p count=<NUMfiles.###
echo %count%

मैंने परीक्षण किया और यह काम करने लगता है।


"लगता है" यहाँ सही शब्द है। (1) यह किसी भी स्थिति dirमें एक के बाद एक बंद है, क्योंकि कमांड में इसमें एक बृहदान्त्र के साथ एक रेखा शामिल है जो एक फ़ाइल नहीं है। (२) यह एक बृहदान्त्र को शामिल करने के लिए समय प्रारूप पर निर्भर करता है, जो जरूरी नहीं कि ऐसा होना चाहिए। (3) यह एक बृहदान्त्र को शामिल नहीं करने वाले संख्या प्रारूप पर निर्भर करता है , जो जरूरी नहीं कि ऐसा होना भी चाहिए। इसके अलावा, यहां एक फाइल के माध्यम से जाना अनावश्यक है और अगर आपके पास पहुंच-बुरा विचार नहीं है तो यह काम नहीं करेगा।
जॉय

"NUMfiles। ###" फ़ाइल बनाए बिना इसे कैसे बनाएं?
निकुंचेक

2

बस उन लोगों के लिए एक चेतावनी जो ऊपर ट्रेवोक के पावरशेल उत्तर का उपयोग कर सकते हैं ( विंडोज कमांड प्रॉम्प्ट: वर्तमान निर्देशिका में सभी फ़ाइलों की गिनती कैसे प्राप्त करें? ): डिज़ाइन द्वारा, गेट-चाइल्डइम द्वारा लौटाए गए संग्रह की गणना संपत्ति को गूंजने से भ्रामक परिणाम मिल सकते हैं? यदि मान 1 या 0. है, तो यह है क्योंकि गणना गुण केवल सरणियों पर उपलब्ध है। यदि 2 से कम आइटम Get-ChildItem द्वारा वापस किए जाते हैं, तो परिणाम स्केलर है, और कुछ भी नहीं लौटाता है। इसके आस-पास जाने के लिए, इसे स्पष्ट रूप से एक सरणी में डालें, जैसे, @ (Get-ChildItem C: \ Scripts)।

अधिक जानकारी के लिए, http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file या http://www.vistax64-powershell/266379 देखें -गेट-चाइल्डिटेम-काउंट-नॉट-वर्किंग-वन-फाइलhtml


0

dir फ़ाइलों की संख्या लौटाता है और तल पर स्थित है


0

DIr निश्चित रूप से काम करेगा

सर्वर पर कुछ स्थापित किए बिना, लेकिन अपने कार्य केंद्र पर अधिकार रखने से आप कर सकते हैं:

(gwmi -computer theserver -query "select *from cim_datafile where path = '\\'").count

वह कमांड आपको सभी फाइलें (सिस्टम और छिपी हुई शामिल) देगा और जैसा कि पहले उल्लेख किया गया था कि यदि आप मशीन पर बस कर सकते हैं

(GCI c:\*.*).count

ध्यान दें कि यदि आप शामिल नहीं हैं आपको सभी फाइलों और सभी निर्देशिकाओं की गिनती मिल जाएगी। आप उन सभी को गिनने के लिए छिपी और सिस्टम फ़ाइलों को शामिल करने की आवश्यकता नहीं करेंगे


0

अगर मुझे केवल एक बार इसकी आवश्यकता होती है, तो मैं केवल डीआईआर का उपयोग करूंगा, अन्यथा मैं अपना स्वयं का रोल करने पर विचार करूंगा, शायद एक सी # ऐप के रूप में, क्योंकि यही मैं सबसे अधिक परिचित होगा (हालांकि VBScript या PowerShell भी व्यवहार्य होगा)।

(वैसे - यदि आप cmd.exe का उपयोग कर रहे हैं तो यह डॉस नहीं है)


0

मेरा मानना ​​है कि आप फ़ाइल की गिनती प्राप्त करने के लिए अट्रिब का उपयोग कर सकते हैं:

attrib.exe /s /D *.*|find /c /v "" >> filecount.txt

यह वर्तमान निर्देशिका में फाइल और फ़ोल्डरों की संख्या के साथ वर्तमान निर्देशिका में फाइलसेकंड। Txt नामक फाइल बनाएगा (नई फाइल फ़ाइल सहित)। आप बदल सकते हैं

*.*

सेवा मेरे

<full_path>\*.*

किसी विशेष निर्देशिका की फ़ाइल गणना प्राप्त करने के लिए। यदि आप फ़ोल्डर की गणना नहीं करना चाहते हैं तो "/ D" विकल्प को हटा दें। "/ S" विकल्प निर्दिष्ट पथ में सभी निर्देशिकाओं में फ़ाइलों को संसाधित करता है। इसलिए इसे हटा दें यदि आप केवल निर्दिष्ट पथ में फ़ाइलें चाहते हैं और उप फ़ोल्डर में फ़ाइलें शामिल नहीं करना चाहते हैं।

उदाहरण के लिए यदि आप यह जानना चाहते हैं कि आपके C: \ ड्राइव में कितनी फाइलें हैं और न ही कोई सबफ़ोल्डर जिसे आप कमांड का उपयोग करेंगे:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt

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

@ जोहान्स उस निर्देशिका का उपयोग करें जिसके पास आप तक पहुँच है? उदाहरण के लिए आउटपुट को C: \ MyWritableDir \ filecount.txt में पाइप करें
smoak

फिर भी अनावश्यक।
जॉय

-2

मैं ऐसा ही कुछ कर रहा हूं और यह किसी भी संख्या में फाइलों के साथ तुरन्त काम करता है।

Setlocal enabledelayedexpansion

Dir /A | find "File(s)" >tmp

For /F "tokens=1" %%i in (tmp) do set n=%%i

Del tmp

If !n! GEQ 10 echo Too many files in directory.

क्यों एक बेकार (और त्रुटिपूर्ण) पोस्ट को 6-वर्षीय प्रश्न का उत्तर दें जिसमें पहले से ही बहुत सारे (अच्छे) एवर्स हैं?
मासिमो

@ मासीमो क्योंकि मैं ऊपर दिए गए जवाबों से संतुष्ट नहीं था और अधिक सुरुचिपूर्ण समाधान चाहता था। ज्ञान की खोज के रास्ते में क्यों खड़ा है जो समय तक सीमित नहीं है?
आरोन लोवे

Urgh! जवाब भयानक लग रहे हैं। उत्तर में संपादित समाधान। मुझे धन्यवाद देने की आवश्यकता नहीं है कि मुझे दूसरों की मदद करने के लिए नकारात्मक प्रतिनिधि पसंद है :-P
आरोन लोवे

कुछ आउटपुट रखने के लिए अस्थायी फ़ाइल का उपयोग करने का वास्तव में कोई कारण नहीं है; भी, का उपयोग findकरना एक अच्छा विचार नहीं है। विवरण के लिए स्वीकृत उत्तर देखें।
मासिमो

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