Bir dizindeki tüm uzantı türlerinin listesi nasıl çıkarılır?


28

Bir dizinde ve tekrar tekrar alt dizinlerinde, bir dizindeki her dizinin işlendiği anlamına gelir, dizindeki benzersiz uzantıların tam bir listesini nasıl derlerim?

OS, güncel güncellemelere sahip Windows XP'dir, ancak ne yaptığını söyleyebilirsem komut dosyası çalıştırıyorum, gerçi beğenmediğim için dot-net kurmamayı tercih ederim.

Yanıtlar:


29

Bu toplu komut dosyası yapacak.

@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

Herhangi bir .batdosya olarak kaydedin batchfileve geçerli dizini listelemek için komutla çalıştırın (adını verdiğiniz şeyin yerine koyun) veya yolunu belirtin batchfile "path". Tüm alt dizinleri arayacaktır.

Bir dosyaya vermek istiyorsanız, batchfile >filename.txt(veya batchfile "path" >filename.txt) kullanın .

açıklama

Satırdan önceki her şey for /f...sadece işleri ayarlar: arama yapmak için hedef dizini alır , döngüde güncelleme değişkenleri yapmama izin veren gecikmeli genişletmeyi sağlar ve neater çıkışı için kullanabileceğim bir newline ( LF) tanımlar . Oh, ve %~1"iki argümanlı alıntıları önleyen" ilk argümanı al, tırnakları kaldır "araçları - bak for /?.

Döngü, bu dir /b /s /a:-d "%target%"komutu kullanarak hedefin altındaki tüm alt dizinlerdeki tüm dosyaların listesini alır.

%%~xiuzantısı, dirkomutun döndürdüğü tam yolların dışına çıkarır .

Boş bir uzantı "FileWithNoExtension" ile değiştirilir, bu nedenle böyle bir dosya olduğunu bilirsiniz - bunun yerine boş bir satır eklersem, o kadar açık değildir.

Tüm mevcut liste find, benzersizliği sağlamak için bir komutla gönderilirse . Find komutunun metin çıktısı nulesasen karadeliğe gönderilir - istemiyoruz. :Listenin sonuna her zaman bir tane eklediğimizden , :kısmi sonuçlarla eşleşmeyecek şekilde arama sorgusunun bittiğinden de emin olmalıyız - yorumları görün.

% ERRORLEVEL% findkomutu tarafından ayarlanır , 0 değeri bir eşleşme olduğunu gösterir. Bu nedenle, 0 değilse, geçerli uzantı listede bulunmuyor ve eklenmelidir.

Yankı çizgisi temelde çıktı verir ve ayrıca :güzel görünmesi için yer tutucularımı ( ) yeni satırlarla değiştiririm.


+1 @Bob: Şaşırtıcı cevap, açıklamanın eklenmesi de büyük bir yardımcı oldu. Sadece senaryoyu test ettim, testin sonuçlarını gözden geçirdi ve her şey harika çalıştı. Tekrar, teşekkürler!
gaflar

1
MÜKEMMEL çalıştı! Aşağıdaki söz dizimini kullandım:batchfile "path" >filename.txt
lucaferrario 28:14

Harika senaryo! Ancak bununla ilgili küçük bir hata var: Klasör dosya içeriyorsa aaa.cssve zzz.csuzantı .cskod tarafından bildirilmez.
Goozak

1
@Goozak Whoops. Şimdi düzeltildi. Metin aramanın harikaları ... arama sorgusunun :sınırlarla eşleşmesi için sona ermesini sağlamıştır.
Bob,

19

Toplu komut dosyası gereksinimini kesin olarak karşılamamama rağmen, tek satırlı bir powershell komut dosyası kullandım:

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

Potansiyel olarak komut satırından / toplu iş dosyasından çalıştırabilirsiniz:

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

Bunun için kredi talep etmiyorum ve elbette, Powershell'in kurulu olması gerekecek. Windows'un yeni sürümleri için, bunun üstesinden gelmek için herhangi bir şey yok.

Kaldırırsanız C:\MyDirectory, geçerli dizinde yürütülür.

Sonunda aşağıdakine benzer bir şey içeren bir FileExtensions.txt dosyası üretecektir:

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

Klasör yapınıza bağlı olarak, ara sıra uzun bir yolunuz olduğunu bildiren hatalar alabilirsiniz.

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.

Buradaki herhangi bir alt dizin de ayrıştırılmaz, ancak her şeyin sonuçları yine de gösterilecektir.


Teşekkürler, bunun yararlı bir cevap olduğuna katılıyorum. İlişkili olmayan bir notta, sadece tek bir cevabı nasıl gönderdiğinizi biraz şaşırttı, ancak art arda 100 gün boyunca Süper Kullanıcı'yı ziyaret etmek için "Fanatik" rozeti bulundurun. Siteye yer imi konmuş veya başka bir şey var mı?
fırtınası

Rozet 2010 yılında etkin bir şekilde gizlendiğimde verildi, ancak SO: stackoverflow.com/users/31532/dan-atkinson adresinde çok daha etkinim . :)
Dan Atkinson

4

PowerShell kullanarak ayrıntılı bir cevap: (Windows XP ile PowerShell'i kurmak zorunda kalacaksınız):

Hey, Komut Dosyası Yazan! Dosya Koleksiyonunda Kullanılan Benzersiz Dosya Uzantılarını Seçmek İçin Windows PowerShell'i Nasıl Kullanabilirim?


1
PowerShell kesinlikle komut satırından çok daha kolay olsa da, .NET tabanlı. Maalesef “dot-net kurmamayı tercih ederim” aleyhinde olanlara karşı çıkıyor.
Bob

1
+1 @RichardM: Bob ile aynı fikirde. Ayrıca, bulunan uzantı örneklerinin sayımıyla ilgili kod - PowerShell hakkında hiçbir şey bilmemek - çok hafızalı görünüyor; yani, sadece her bir örneği saymak yerine, her uzantı için bir uzantının yinelenen örneklerini saklamak için bir dizi oluşturduğuma inanıyorum, sonra sonunda her bir uzantı dizisi için bir sayım yapıyorum ki bu bana çok tuhaf geliyor. uzatma örnekleri sayılıyor. Bir şey mi eksik? (Dedi ki, ilk PowerShell tek satırlık güzel olduğunu ve dotnet sevmediğim olmasaydı ben denemek istiyorum.)
gaflar

1
Bu adil. Bu soru, bir PowerShell çözümüne daha açık olan arama yapanları çekebilir. Dikkat edin, iyi bir Google araması yukarıdaki bağlantıyı da bulacaktır.
Richard

3
Bu bağlantı için +1. Açıkça görülen hatalar her şeyi beğenmez. Net, ama bu yukarıdaki sorunun bu sorunun en iyi ve uzun vadeli çözümü olduğu anlamına gelmez . Daha fazla dil daha iyi düşünüyorum.
Steve Rathbone

1
İşte powershell kullanarak özyinelemeli aramayı ele alan başka bir bağlantı. robertbigec.wordpress.com/2011/01/07/…
goodeye

0

Kullandığınız yolun altındaki cmd'deki tüm benzersiz uzantıları listelemek için:

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

0

Değiştirmeyi faydalı buldum

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

için

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

ve değiştirmek

echo %extlist::=!LF!%

için

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

Oluşturulan dosya (satır beslemesi yok, ancak önemi yok) .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

ki daha sonra projem için kullanabildim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.