จะแยกรายการประเภทส่วนขยายทั้งหมดในไดเรกทอรีได้อย่างไร


28

ภายในไดเรกทอรีและเรียกซ้ำภายในไดเรกทอรีย่อยซึ่งหมายความว่าทุกไดเรกทอรีในไดเรกทอรีได้รับการประมวลผลฉันจะรวบรวมรายการทั้งหมดของส่วนขยายเฉพาะภายในไดเรกทอรีได้อย่างไร

ระบบปฏิบัติการคือ Windows XP ที่มีการอัปเดตทั้งหมดในปัจจุบัน แต่ฉันก็ใช้งานสคริปต์ได้ถ้าฉันสามารถบอกได้ว่ามันทำอะไรอยู่แม้ว่าฉันจะไม่ต้องการติดตั้ง dot-net เนื่องจากฉันไม่ชอบมันจริงๆ

คำตอบ:


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...บรรทัดจะตั้งค่า: มันจะได้รับไดเรกทอรีเป้าหมายในการค้นหาเปิดใช้งานการขยายที่ล่าช้าซึ่งทำให้ฉันสามารถปรับปรุงตัวแปรในลูปและกำหนด newline ( LF)ที่ฉันสามารถใช้สำหรับเอาท์พุท neater โอ้และ%~1วิธีการ "ได้รับอาร์กิวเมนต์แรกเอาคำพูด" ซึ่งป้องกันไม่ให้สองเท่าขึ้นคำพูด - for /?ดู

ลูปจะใช้dir /b /s /a:-d "%target%"คำสั่งนั้นเพื่อรวบรวมรายการไฟล์ทั้งหมดในไดเรกทอรีย่อยทั้งหมดภายใต้เป้าหมาย

%%~xiแยกส่วนขยายออกจากพา ธ เต็มที่dirคำสั่งส่งคืน

ส่วนขยายที่ว่างเปล่าจะถูกแทนที่ด้วย "FileWithNoExtension" ดังนั้นคุณจึงรู้ว่ามีไฟล์ดังกล่าว - หากฉันเพิ่มบรรทัดว่างแทนมันจะไม่ชัดเจน

รายการปัจจุบันทั้งหมดถ้าส่งผ่านfindคำสั่งเพื่อให้แน่ใจว่าไม่ซ้ำกัน เอาต์พุตข้อความของคำสั่ง find ถูกส่งไปnulโดยหลักแล้วเป็นหลุมดำ - เราไม่ต้องการมัน เนื่องจากเราต่อ:ท้ายรายการเสมอเราจึงควรตรวจสอบให้แน่ใจว่าคำค้นหาลงท้ายด้วย:ดังนั้นจึงไม่ตรงกับผลลัพธ์บางส่วน - ดูความคิดเห็น

% ERRORLEVEL% ถูกตั้งค่าโดยfindคำสั่งค่า 0 หมายถึงมีการจับคู่ ดังนั้นหากไม่ใช่ 0 ส่วนขยายปัจจุบันจะไม่อยู่ในรายการและควรเพิ่ม

โดยทั่วไปแล้วเส้นเสียงสะท้อนนั้นออกมาและฉันยังแทนที่ตัวยึดตำแหน่งของฉัน ( :) ด้วยการขึ้นบรรทัดใหม่เพื่อให้ดูดี


+1 @Bob: คำตอบที่น่าทึ่งการเพิ่มคำอธิบายก็เป็นประโยชน์อย่างมากเช่นกัน เพิ่งทดสอบสคริปต์ตรวจสอบผลลัพธ์ของการทดสอบและทุกอย่างใช้งานได้ดี ขอบคุณอีกครั้ง!
ความผิดพลาด

1
มันทำงานได้อย่างสมบูรณ์แบบ! ฉันใช้ไวยากรณ์ต่อไปนี้:batchfile "path" >filename.txt
lucaferrario

สุดยอดสคริปต์! แต่มีข้อผิดพลาดเล็ก ๆ น้อย ๆ ด้วย: หากโฟลเดอร์มีไฟล์aaa.cssและสคริปต์จะไม่รายงานzzz.csส่วนขยาย .cs
Goozak

1
@ Goozak อ๊ะ แก้ไขแล้ว ความมหัศจรรย์ของการค้นหาข้อความ ... ต้องทำให้แน่ใจว่าคำค้นหาสิ้นสุดลงด้วย:การบังคับให้ตรงกับขอบเขต
บ๊อบ

19

แม้ว่าจะไม่ตรงตามข้อกำหนดสำหรับสคริปต์ชุดงาน แต่ฉันใช้สคริปต์ PowerShell บรรทัดเดียว:

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 สำหรับ Windows รุ่นใหม่ไม่มีอะไรเกี่ยวข้องกับเรื่องนี้

หากคุณลบ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.

ไดเรกทอรีย่อยใด ๆ ในนั้นจะไม่ถูกแยกวิเคราะห์ แต่ผลลัพธ์สำหรับทุกสิ่งจะยังคงแสดงอยู่


ขอบคุณเห็นด้วยว่ามันเป็นคำตอบที่มีประโยชน์ ในบันทึกที่ไม่เกี่ยวข้องบิตทำให้งงว่าคุณโพสต์คำตอบเดียวเพียงใด แต่ยังมีตราสัญลักษณ์ "คลั่ง" สำหรับการเยี่ยมชม Superuser ติดต่อกัน 100 วัน คุณมีเว็บไซต์ที่คั่นหน้าหรืออะไร
ความผิดพลาด

ป้ายที่ได้รับรางวัลในปี 2010 เมื่อฉันได้อย่างมีประสิทธิภาพซุ่ม แต่ฉันไกลใช้งานมากขึ้นในดังนั้น: stackoverflow.com/users/31532/dan-atkinson :)
Dan Atkinson

4

นี่คือคำตอบโดยละเอียดโดยใช้ PowerShell (สำหรับ Windows XP คุณจะต้องติดตั้ง PowerShell):

เฮ้, Scripting Guy! ฉันจะใช้ Windows PowerShell เพื่อเลือกนามสกุลไฟล์เฉพาะที่ใช้ในกลุ่มไฟล์ได้อย่างไร


1
ในขณะที่ PowerShell นั้นง่ายกว่าบรรทัดคำสั่งอย่างแน่นอน แต่ก็ขึ้นอยู่กับ. NET ซึ่งน่าเสียดายที่ขัดกับ "ฉันไม่ต้องการติดตั้ง dot-net"
Bob

1
+1 @RichardM: เห็นด้วยกับ Bob นอกจากนี้รหัสที่เกี่ยวข้องกับการนับอินสแตนซ์ของส่วนขยายที่พบซึ่งไม่ทราบอะไรเกี่ยวกับ PowerShell จะมีหน่วยความจำหนักมาก ฉันเชื่อว่าการสร้างอาร์เรย์เพื่อเก็บอินสแตนซ์ที่ซ้ำกันของส่วนขยายสำหรับแต่ละส่วนขยายจากนั้นทำการนับสำหรับแต่ละส่วนขยายอาร์เรย์ในตอนท้ายซึ่งสำหรับฉันดูเหมือนจะเป็นวิธีที่แปลกมาก การขยายอินสแตนซ์ของการนับ ฉันพลาดอะไรไปรึเปล่า? (ที่กล่าวว่า PowerShell ตัวแรกมีซับในที่ดีและฉันจะลองถ้าไม่ชอบดอทเน็ต)
blunders

1
นั่นยุติธรรม คำถามนี้อาจดึงดูดผู้ค้นหาที่เปิดกว้างยิ่งขึ้นสำหรับโซลูชัน PowerShell โปรดทราบว่าการค้นหาโดย Google ที่เหมาะสมจะพบลิงค์ด้านบนเช่นกัน
RichardM

3
+1 สำหรับลิงค์นี้ เห็นได้ชัดว่า blunders ไม่ชอบทุกอย่าง. net แต่นั่นไม่ได้หมายความว่าวิธีการแก้ปัญหาข้างต้นเป็นทางออกระยะยาวที่ดีที่สุดสำหรับปัญหานี้ ยิ่งฉันคิดภาษามากเท่าไหร่
Steve Rathbone

1
นี่คืออีกลิงค์หนึ่งที่เน้นการค้นหาแบบเรียกซ้ำโดยใช้ PowerShell 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

ไฟล์ที่สร้างขึ้นมี (ไม่มี linefeeds แต่ไม่สำคัญ) .bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.PDF.JPG.gif.jpeg .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb

ซึ่งฉันสามารถใช้สำหรับโครงการของฉันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.