Windows कमांड प्रॉम्प्ट से केवल पूर्ण पथ और फ़ाइल आकार दिखाते हुए फ़ाइलों की पुनरावृत्ति करें


50

मैं एक फ़ाइल को फ़ाइल नाम (पूर्ण पथ सहित) और किसी विशेष निर्देशिका में सभी फ़ाइलों के लिए फ़ाइल आकार और इसके किसी भी उप-निर्देशिका (यानी पुनरावर्ती) में उत्पन्न करने का प्रयास कर रहा हूं। आदर्श रूप में, मुझे फ़ाइल आकार में कॉमा नहीं चाहिए (लेकिन मैं उनके लिए व्यवस्थित हो जाऊंगा!)

निम्न आदेश यह करता है लेकिन फ़ाइल आकार के बिना:

dir /b /s /a:-D > results.txt

एक उदाहरण आउटपुट जैसा दिखेगा:

C:\Users\Martin\Pictures\Table\original\PC120013.JPG  227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG  123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG  932344

मुझे नहीं लगता कि यह dirअकेले उपयोग करना संभव है , हालांकि मैं गलत साबित होना पसंद करूंगा। क्या ऐसा करने का एक और तरीका है, केवल कमांड प्रॉम्प्ट से उपलब्ध कमांड का उपयोग करना?

जवाबों:


28

यह करना चाहिए:

@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

यह बहुत कुशल नहीं है ... एक टन फ़ाइलों वाले फ़ोल्डर्स के लिए इसे चलाना स्केच हो सकता है, इसलिए इसे पहले छोटे फ़ोल्डरों पर आज़माएं।

से "के लिए /?" सहायता पाठ (मैंने 'I' के बजाय 'a' का उपयोग किया)

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

The modifiers can be combined to get compound results:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

6
मैंने इसका उपयोग करते हुए एक छोटा सा टुकड़ा मारा: फ़ाइल नाम में रिक्त स्थान के साथ फाइलें सही ढंग से पंजीकृत नहीं हुईं। इसे ठीक करने के लिए मैंने इस "tokens=*"प्रकार जोड़ा@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
डॉन विंस

इसे txtफाइल में कैसे प्रिंट करें ?
सईद नेमाटी

3
यह होना चाहिएfor /r %a in (*) do echo %~fa %~za
ZAB

1
@Saeed Neamati - यहाँ एक उदाहरण है >> C:\Temp\VideoList.txtजो कुछ भी प्रक्रिया आया से पहले नाम के एक पाठ फ़ाइल के लिए बाहर लिखा जाता है के परिणाम - VideoList । एक > का उपयोग करने से फ़ाइल को अधिलेखित कर दिया जाएगा ( यदि यह पहले से मौजूद है ) और उपयोग करने पर >> पाठ फ़ाइल ( यदि यह पहले से मौजूद है ) तो अंत में नए परिणाम जोड़ देगा । यदि पाठ फ़ाइल अभी तक मौजूद नहीं है, तो यह कमांड निर्दिष्ट नाम के साथ एक नई फ़ाइल लिखती है।
user23715

इसने मुझे * .dwg फ़ाइलों की सूची दी, एक पाठ फ़ाइल के लिए फ़ाइल का आकार, sans:@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CAD

14

वैकल्पिक # 1: मेरे लिए # 2 की तुलना में / R अधिक सहज है।
वैकल्पिक # 2: फ़ॉर / एफ ब्रायनएडकिंस के सुझाव में "नामों में रिक्त स्थान" के साथ समस्या को ठीक करता है।
वैकल्पिक # 3: FORFILES मेरी पसंद होगी सिवाय इसके कि पथ दोहरे उद्धरण चिह्नों में है।

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

मैंने एम्बेडेड स्पेस के साथ डायरेक्टरी और फाइलनाम के साथ सभी विकल्पों का परीक्षण किया, एक 200+ कैरेक्टर का नाम, बिना किसी एक्सटेंशन वाला एक फ़ाइल नाम, और एक छोटी ड्राइव (केवल समय के लिए; थोड़ी धीमी गति से) - जैसे कि ब्रायन ने सुझाव दिया - लेकिन तब विंडोज एक्सप्लोरर में खोज कर रहा है (यही कारण है कि मैंने सब कुछ खोज ऐप इंस्टॉल किया है)।

वैकल्पिक # 1: के लिए / आर

सर्वश्रेष्ठ (?) यह जानने की कोशिश करते हुए कि ब्रायन का समाधान मेरे लिए काम नहीं कर रहा था, मैंने मदद के लिए देखा और / आर दृष्टिकोण की कोशिश करने का फैसला किया। (फ़ाइल बनाना वैकल्पिक # 2 के समान होगा।)

@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA

उदाहरण - काम करता है (पुनरावृत्ति प्रदर्शित करने के लिए ऊपर से अलग निर्देशिका)

@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

वैकल्पिक # 2: के लिए / एफ

ब्रायन एडकिंस ने सुझाव दिया: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

एक सही उत्तर है:

@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA 

एक फ़ाइल में दबाए गए आउटपुट और आउटपुट (संलग्न) के साथ एक और अधिक पूर्ण उत्तर है:

@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt

नोट: "delims = *" एक वर्ण निर्दिष्ट करता है जिसे फ़ाइल नाम में अनुमति नहीं है।
नोट: 2 डी कमांड / a: -d के माध्यम से निर्देशिकाओं को भी दबा देता है।
नोट: यदि कोई भिन्न चर नाम चुनता है, तो चर और बड़े मापदंडों के बीच अंतर को स्पष्ट करने के लिए परिवर्तनशील नाम के लिए बनाया गया।
नोट: ओपी ने फ़ाइल के लिए आउटपुट के रूप में सिर्फ अनुदान के लिए फाइल करने के लिए आवेदन किया।

मुझे लगता है कि मुझे वास्तव में ईसीएचओ की स्थिति की जांच करनी चाहिए और इसे भी रीसेट करना चाहिए।

अंक - नामों में स्थान

ब्रायन का प्रस्तावित समाधान रिक्त स्थान वाले फ़ाइल और फ़ोल्डर नामों को नहीं संभालता है (कम से कम मेरे विस्टा कॉन्फ़िगरेशन पर नहीं)।

उदाहरण - गलत (बिना परिवाद के; ओपी के अनुसार प्रतिपूर्ति निर्देशिका को शामिल करना लेकिन जोर देने से पहले और बाद में आकार दोनों के साथ)

काटे गए नाम और आकार (गलत 6 फाइलों में से 4):

@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
 C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
 C:\DeleteLater\Folder
 C:\DeleteLater\Folder
 C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

उदाहरण - सही (नोट आउटपुट स्क्रीन पर, फ़ाइल में संलग्न नहीं)

@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

वैकल्पिक # 3: FORFILES (भाव जारी)

यह समाधान FORFILES प्रलेखन ( forfiles /?) में अंतिम दो उदाहरणों से सीधा है ।

FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

इन उदाहरणों को लिखने और फ़ाइल में लिखने से उत्तर मिलता है (लगभग):

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt

ध्यान दें कि पथ आउटपुट में उद्धरण में है।
इस बात से कोई फर्क नहीं पड़ता कि टॉगल किया गया है echo onया नहीं echo off
प्रत्येक निर्देशिका को अलग करने वाली एक रिक्त पंक्ति को जोड़ना IF का एक तुच्छ विस्तार होगा।

सावधानी : मास्क का उपयोग/m *.*एक्सटेंशन के बिना फ़ाइलों को वापस नहीं करेगा (उदाहरण में अंतिम फ़ाइल)!

एक तरफ : यह प्रत्येक निर्देशिका में उस निर्देशिका की सामग्री के साथ एक फ़ाइल लिखता है:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"ओपी नहीं चाहता था लेकिन कभी-कभी काम करता है।

उदाहरण - काम करता है (लेकिन उद्धरण में पूर्णपथ के साथ)

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize"

"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0

इस उदाहरण में एक सुपर लंबी फ़ाइल नाम के साथ एक अतिरिक्त निर्देशिका और बिना किसी एक्सटेंशन के फ़ाइल नाम शामिल है।

समस्या: उद्धरण में पथ

तो, क्या ओपी उदाहरण के अनुसार अवांछित (?) उद्धरणों को हटाने का एक आसान तरीका है और वैकल्पिक # 3 को बचाने के लिए: FORFILES। (अलंकारिक प्रश्न: क्या उद्धरण एक विशेषता या दोष हैं?)


1

मुझे लगता है कि इसके लिए एक अतिरिक्त उत्कर्ष की आवश्यकता होती है , लेकिन आप sfk उपयोगिता का उपयोग करते हुए इसे पर्याप्त रूप से प्राप्त कर सकते हैं :

sfk cwd +run -yes "sfk list -size -tab $qfile +toclip"

sfk fromclip > C:\_temp\sfk_list_output.txt

(मुझे यहाँ sfk कमांड चेनिंग का उपयोग करने का तरीका मिला )


1
powershell "dir | select name,length"

यह ओपी प्रश्न पर धोखा हो सकता है। हालाँकि, यह प्रश्न अब आधुनिक विंडोज-आधारित प्रणालियों पर प्रासंगिक नहीं है। द डार उर्फ ​​का उपयोग तार्किक लिंक को आकर्षित करने में मदद के लिए किया गया था।


2
मैंने यह (विंडोज 7) आजमाया। इसे चलाने में 30 सेकंड से अधिक का समय लगा (20 प्रविष्टियों के साथ एक निर्देशिका पर) और यह उपनिर्देशिकाओं में नहीं उतरा।
स्कॉट

पुनरावर्तन करने के लिए कृपया इसे बदल दें: powershell "Get-ChildItem -Recurse| select name,length"
जियोर्जोमुगैनी

0

नीचे मैंने misc वीडियो फ़ाइलों का पता लगाने के लिए उपयोग किया है जो एक नेटवर्क ड्राइव पर बहुत अधिक कमरे ले रहे थे और एक स्थानीय पीसी पर एक पाठ फ़ाइल के परिणाम लिखते हैं।

मैं अपने स्वयं के कुछ देर के उत्तर को तीन कारणों से पोस्ट कर रहा हूं। एक, मुझे संक्षिप्त उत्तर पसंद हैं। दो, स्क्रिप्ट की इस एकल पंक्ति ने मेरे लिए एक नेटवर्क सहित कई सेटिंग्स में काम किया। ब्रायनएडकिंस के उत्तर के तहत डॉन विंस के संभावित अस्पष्ट टिप्पणी के तीन, टोकन का उपयोग करके उन में रिक्त स्थान के साथ फ़ाइल नामों से समस्याओं को बायपास किया जा सकता है।

for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt

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

इस पृष्ठ ss64 में dir कमांड के उपयोग की बहुत अच्छी प्रस्तुति है, जो सभी स्विचों, कई स्विच संयोजनों को सूचीबद्ध करता है, और उचित सिंटैक्स के कई उपयोगी उदाहरण दिखाता है। यह विभिन्न स्टैक एक्सचेंज समुदायों के रूप में व्यापक नहीं है, लेकिन कमांड लाइन / स्क्रिप्टिंग स्क्रिप्टिंग के साथ सहज होने पर प्रस्तुति में एक निश्चित स्पष्टता है।


0

मैं निम्नलिखित आदेश के साथ इस तक पहुँच गया हूँ:

(for /R "\path\to\directory\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

परिणाम:

D:\Users\Natasha>(for /R ".\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"


D:\Users\Natasha\Flowers_ (12).jpg 118886

D:\Users\Natasha\SomeFolder\data.txt 1241

D:\Users\Natasha\SomeFolder\CS\Counter-Strike_1.6.exe 272645624

PS यह बिलआर (वैकल्पिक # 1) के उत्तर पर आधारित है। हालांकि मेरे मामले में यह साथ लटका हुआ है @echo off


0

मुझे "डु" कमांड बहुत मददगार लगती है और यह विंडोज और यूनिक्स दोनों पर काम करती है (इसका उपयोग यह जांचने के लिए किया जाता है कि विंडोज पीसी से लिनक्स डेटा पर बहुत सारे डेटा ट्रांसफर करते समय सभी फाइलों को कॉपी किया गया):

du -ah "C:\your_dir" > "C:\file_list.txt"

आउटपुट:

15  C:\your_dir/.htaccess
608 C:\your_dir/folder/hello.txt
1.0 C:\your_dir/folder/subfolder/test.txt
1.0 C:\your_dir/folder/subfolder
1.2M    C:\your_dir/folder/world.txt
1.2M    C:\your_dir/folder
9.0 C:\your_dir/no_file_ending
11  C:\your_dir/sample document 1.txt
684K    C:\your_dir/sample document 2 - äöüßÄÖÜáà.txt
1.9M    C:\your_dir

हालाँकि, मैं नोटपैड में विशेष वर्णों को केवल सही ढंग से देख सकता था, नोटपैड ++ में नहीं (कुछ एएनएसआई / यूटीएफ -8 एन्कोडिंग बात होनी चाहिए, अभी बिल्कुल विश्लेषण करने का समय नहीं है)। इसके अलावा मुझे फ़ाइल नाम के बाद आकार प्रदर्शित करने का कोई समाधान नहीं मिला। बाइट्स या किलोबाइट में आकार प्रदर्शित करने के लिए "h" के बजाय "b" या "k" विकल्पों का उपयोग करें। जब मैं विश्लेषण करना चाहता हूं तो फ़ोल्डर के बाहर कमांड चलाते समय मुझे कुछ परेशानी हुई। तो दोनों सही निर्देशिका में कमांड दर्ज करें ("C: \ your_dir" इस उदाहरण में) और इसे कमांड में निर्दिष्ट करें।


-1

Dir / b / s / a: -D> results.txt में omit और परिणाम जैसे दिखना चाहिए, (यानी dir / s / a: -D> results.txt):

ड्राइव H में वॉल्यूम FILES वॉल्यूम सीरियल नंबर C9EB-112E है

H: \ Files की निर्देशिका

09/29/2014 11:36 PM 0 टेस्टिंग। Txt 1 फाइल (ओं) 0 बाइट्स

H: \ Video \ Action \ Comix की निर्देशिका

10/06/2012 09:51 AM 184,740 file1.txt 07/20/2012 06:21 AM
864,832 file2.txt 08/31/2009 08:47 PM 606,638 file3.txt 08/31/2009 09:07 PM 160,320 file4 ।टेक्स्ट


यह मूल प्रश्न का उत्तर नहीं है । यह उस आउटपुट का उत्पादन नहीं करता है जो उसने ओपी से मांगा था।
DavidPostill

-1
where * /t  

अत्यधिक जटिल हो रही बिना, यह वांछित उत्पादन करना चाहिए। यह ओपी द्वारा पूछे जाने की तुलना में थोड़ा अधिक देगा, लेकिन मुझे लगा कि यह ध्यान देने योग्य है। वर्तमान के अलावा किसी निर्देशिका को निर्दिष्ट करने के लिए / R स्विच जोड़ें।


1
जैसा कि मैंने कोशिश की अपने उत्तर को अपडेट करने और पुष्टि करने पर विचार करें और एक त्रुटि संदेश प्राप्त करें ERROR: Invalid syntax. Value expected for '/r'ताकि ड्राइंग बोर्ड पर वापस जाने और सही सिंटैक्स प्रदान करने पर विचार करें और अपने उत्तर को सही विवरण के साथ संपादित करें।
दलाल जूस आईटी

मान दर्ज करने पर विचार करें ... / R निर्देशिका स्विच है, यदि आप इसे छोड़ देते हैं, तो वर्तमान निर्देशिका में डिफ़ॉल्ट है।
someguy

"यह ओपी के लिए पूछे जाने की तुलना में थोड़ा अधिक देगा"। क्या तुम मजाक कर रहे हो?  where /?कहते हैं, “डिफ़ॉल्ट रूप से, खोज वर्तमान निर्देशिका के साथ और पथ पर्यावरण चर द्वारा निर्दिष्ट पथों में की जाती है"- इसलिए आपकी where * /tकमांड प्रत्येक फ़ाइल को C:\Windows\System32, कुछ उपनिर्देशिकाओं C:\Program Filesऔर प्रत्येक अन्य निर्देशिका में सूचीबद्ध करती है PATH। मेरे लिए, यह 3000 से अधिक लाइनें थीं। कृपया इसे उचित बनाने के लिए अपने उत्तर को संपादित करने पर विचार करें। पुनश्च बिना  /R, यह पुनरावर्ती नहीं है।
स्कॉट

जहां / आर। *। * मेरे लिए काम किया। / आर। निर्दिष्ट स्थान से पुनरावर्ती खोज करने के लिए कहते हैं (इस मामले में इसकी वर्तमान निर्देशिका)। * *। * मिलान करने के लिए पैटर्न है। तो WHERE / R% USERPROFILE% * .docx उपयोगकर्ता के फ़ोल्डर में सभी शब्द फ़ाइलों को दिखाएगा। (इन टिप्पणियों में * साथ भागना है)
DHW
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.