निर्देशिका के भीतर एक्सटेंशन प्रकारों की पूरी सूची कैसे निकालें?


28

एक निर्देशिका के भीतर, और इसके भीतर उप-निर्देशिका होती है, जिसका अर्थ है कि एक निर्देशिका के भीतर प्रत्येक निर्देशिका को संसाधित किया जाता है, मैं निर्देशिका के भीतर अद्वितीय एक्सटेंशन की पूरी सूची कैसे संकलित करता हूं?

ओएस सभी मौजूदा अपडेट के साथ विंडोज एक्सपी है, लेकिन मैं ठीक स्क्रिप्ट चला रहा हूं, अगर मैं बता सकता हूं कि यह क्या कर रहा है, हालांकि मैं डॉट-नेट स्थापित नहीं करना पसंद करूंगा, क्योंकि मैं वास्तव में इसे पसंद नहीं करता हूं।

जवाबों:


29

यह बैच स्क्रिप्ट करेगा।

@echo off

set target=%~1
if "%target%"=="" set target=%cd%

setlocal EnableDelayedExpansion

set LF=^


rem Previous two lines deliberately left blank for LF to work.

for /f "tokens=*" %%i in ('dir /b /s /a:-d "%target%"') do (
    set ext=%%~xi
    if "!ext!"=="" set ext=FileWithNoExtension
    echo !extlist! | find "!ext!:" > nul
    if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)

echo %extlist::=!LF!%

endlocal

इसे किसी भी .batफ़ाइल के रूप में सहेजें , और इसे कमांड के साथ चलाएं batchfile(वर्तमान में जो कुछ भी आपने नाम दिया है उसे प्रतिस्थापित करें) वर्तमान निर्देशिका को सूचीबद्ध करने के लिए, या इसके साथ एक पथ निर्दिष्ट करें batchfile "path"। यह सभी उपनिर्देशिकाओं को खोजेगा।

यदि आप किसी फ़ाइल को निर्यात करना चाहते हैं, तो उपयोग batchfile >filename.txt(या batchfile "path" >filename.txt) करें।

व्याख्या

for /f...लाइन से पहले सब कुछ बस चीजों को सेट करता है: यह खोज करने के लिए लक्ष्य निर्देशिका प्राप्त करता है, विलंबित विस्तार को सक्षम करता है जो मुझे लूप में अद्यतन चर करने देता है और एक नई पंक्ति ( LF) को परिभाषित करता है जिसका उपयोग मैं नीटर आउटपुट के लिए कर सकता हूं। ओह, और %~1इसका मतलब है "पहले तर्क प्राप्त करें, उद्धरणों को हटा दें" जो दोगुनी-अप उद्धरणों को रोकता है - देखें for /?

लूप उस dir /b /s /a:-d "%target%"कमांड का उपयोग करता है , लक्ष्य के तहत सभी उपनिर्देशिकाओं में सभी फाइलों की सूची को हथियाने के लिए।

%%~xiएक्सटेंशन को पूर्ण पथ से बाहर निकालता है जो dirकमांड रिटर्न करता है।

एक खाली एक्सटेंशन को "FileWithNoExtension" से बदल दिया जाता है, इसलिए आपको पता है कि ऐसी कोई फ़ाइल है - अगर मैंने इसके बजाय एक खाली लाइन जोड़ी है, तो यह बिल्कुल स्पष्ट नहीं है।

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

% ERRORLEVEL% findकमांड द्वारा सेट किया गया है , 0 का मान इंगित करता है कि कोई मैच था। इसलिए यदि यह 0 नहीं है, तो वर्तमान एक्सटेंशन अभी तक सूची में नहीं है और इसे जोड़ा जाना चाहिए।

इको लाइन मूल रूप से आउटपुट करती है, और मैं अपने प्लेसहोल्डर्स ( :) को नई लाइनों के साथ बदलकर अच्छा दिखता हूं ।


+1 @ याकूब: अद्भुत जवाब, स्पष्टीकरण जोड़ना बहुत बड़ी मदद थी। बस स्क्रिप्ट का परीक्षण किया, परीक्षण के परिणामों की समीक्षा की, और सब कुछ बहुत अच्छा काम किया। फिर से धन्यवाद!
ब्लंडर्स

1
यह सही काम किया! मैंने निम्नलिखित वाक्यविन्यास का उपयोग किया:batchfile "path" >filename.txt
२fer

महान स्क्रिप्ट! लेकिन इसके साथ एक छोटा बग है: यदि फ़ोल्डर में फ़ाइलें हैं aaa.cssऔर zzz.cs, .csस्क्रिप्ट द्वारा विस्तार की सूचना नहीं दी जाएगी।
गोज़कॉक

1
@ गौज़कॉप्स। अब तय हो गया। पाठ खोज के अजूबे ... यह सुनिश्चित करना था कि खोज क्वेरी :को सीमाओं से मेल खाने के लिए मजबूर किया गया था।
बॉब

19

हालांकि एक बैच स्क्रिप्ट की आवश्यकता को सख्ती से पूरा नहीं करते हुए, मैंने एक-लाइन पॉवरशेल स्क्रिप्ट का उपयोग किया है:

Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt

आप संभावित रूप से इसे कमांड लाइन / बैच फ़ाइल से चला सकते हैं:

Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"

मेरा दावा है कि इसके लिए कोई क्रेडिट नहीं है, और निश्चित रूप से, आपको Powershell को स्थापित करने की आवश्यकता होगी। विंडोज के नए संस्करणों के लिए, इसके आस-पास कोई भी नहीं है।

यदि आप C:\MyDirectoryइसे हटाते हैं तो यह वर्तमान निर्देशिका में निष्पादित होगा।

अंत में यह एक FileExtensions.txt का उत्पादन करेगा जिसमें कुछ इस तरह है:

+-------+------+
| Count | Name |
+-------+------+
| ----- | ---- |
| 8216  | .xml |
| 4854  | .png |
| 4378  | .dll |
| 3565  | .htm |
| ...   | ...  |
+-------+------+

आपकी फ़ोल्डर संरचना के आधार पर, आपको कभी-कभी त्रुटियां हो सकती हैं जो आपको सूचित करती हैं कि आपके पास एक लंबा रास्ता है।

Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

वहाँ किसी भी उपनिर्देशिका भी पार्स नहीं किया जाएगा, लेकिन बाकी सब के लिए परिणाम अभी भी दिखाएगा।


धन्यवाद, सहमत हूँ कि यह एक उपयोगी उत्तर है। एक असंबंधित नोट पर, थोड़ा हैरान कि आपने केवल एक ही उत्तर कैसे पोस्ट किया है, फिर भी लगातार 100 दिनों तक सुपरसुसर पर जाने के लिए "कट्टर" बैज है। क्या आपके पास साइट बुकमार्क है या कुछ और है?
ब्लंडर्स

बैज 2010 में प्रदान किया गया था जब मैं प्रभावी रूप से दुबक गया था, लेकिन मैं SO: stackoverflow.com/users/31532/dan-atkinson पर कहीं अधिक सक्रिय हूं । :)
डान एटकिंसन

4

1
जबकि PowerShell निश्चित रूप से कमांड लाइन की तुलना में बहुत आसान है, यह .NET पर आधारित है। जो, दुर्भाग्य से, "मैं नेट-नेट स्थापित नहीं करना चाहता हूं" के खिलाफ जाता है।
बॉब

1
+1 @ रीचर्ड: बॉब से सहमत। इसके अलावा, विस्तार के उदाहरणों की गिनती से संबंधित कोड पाया गया - पावरशेल के बारे में कुछ भी नहीं जानना - बहुत स्मृति भारी प्रतीत होता है; प्रत्येक उदाहरण की एक गिनती रखने के बजाय इसका अर्थ है, मेरा मानना ​​है कि प्रत्येक एक्सटेंशन के लिए एक्सटेंशन के डुप्लिकेट इंस्टेंस को संग्रहीत करने के लिए एक सरणी बना रहा है, फिर अंत में प्रत्येक एक्सटेंशन सरणी के लिए एक गिनती कर रहा है, जो मुझे बहुत ही अजीब तरह का लगता है विस्तार के उदाहरणों की गिनती। क्या मैं कुछ भूल रहा हूँ? (उस ने कहा, पहले PowerShell एक-लाइनर अच्छा है, और मैं इसे कोशिश करूँगा अगर मैं डॉटनेट को नापसंद नहीं करता।)
भूल जाता है

1
ये उचित है। यह प्रश्न उन खोजकर्ताओं को आकर्षित कर सकता है जो पावरशेल समाधान के लिए अधिक खुले हैं। ध्यान रहे, एक अच्छी Google खोज उपरोक्त लिंक को भी खोजेगी।
रिचर्ड एमआर

3
इस लिंक के लिए +1। स्पष्ट रूप से ब्लंडर्स सब कुछ नापसंद करते हैं। लेकिन इसका मतलब यह नहीं है कि उपरोक्त समाधान इस समस्या का सबसे अच्छा दीर्घकालिक समाधान है। जितनी ज्यादा भाषाएं मैं उतना बेहतर समझता हूं।
स्टीव रथबोन

1
यहाँ एक और लिंक है जो पॉवरशेल का उपयोग करके पुनरावर्ती खोज को संबोधित करता है। robertbigec.wordpress.com/2011/01/07/…
goodeye

0

अपने उपयोग के पथ के अंतर्गत cmd से सभी अद्वितीय एक्सटेंशन सूचीबद्ध करने के लिए:

Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"

0

मुझे इसे बदलना उपयोगी लगा

if "!ext!"=="" set ext=FileWithNoExtension

सेवा मेरे

if "!ext!"=="" set ext=.FileWithNoExtension

और बदलने के लिए

echo %extlist::=!LF!%

सेवा मेरे

echo %extlist::=!LF!% > ext-list.txt

जनरेट की गई फ़ाइल सम्‍मिलित है (कोई लाइनफ़ीड नहीं है, लेकिन कोई बात नहीं) .bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.DF.JPG.gif.jpeg .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb

जो तब मैं अपनी परियोजना के लिए उपयोग करने में सक्षम था।

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