ディレクトリ内の拡張機能タイプの完全なリストを抽出する方法は?


28

ディレクトリ内、およびそのサブディレクトリ内で再帰的に、つまりディレクトリ内のすべてのディレクトリが処理されることを意味します。ディレクトリ内の一意の拡張子の完全なリストをコンパイルするにはどうすればよいですか?

OSは現在のすべての更新プログラムを備えたWindows XPですが、スクリプトの実行内容を把握できればスクリプトを実行できますが、ドットネットをインストールする必要はありません。

回答:


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%"コマンドを使用して、ターゲットの下のすべてのサブディレクトリにあるすべてのファイルのリストを取得します。

%%~xidirコマンドが返すフルパスから拡張子を抽出します。

空の拡張子は「FileWithNoExtension」に置き換えられるため、そのようなファイルがあることはご存知です。代わりに空の行を追加した場合、それほど明確ではありません。

find一意性を確保するために、コマンドを介して送信された場合、現在のリスト全体。findコマンドのテキスト出力はに送信されnul、本質的にブラックホールになります。:リストの最後に常にa を追加する:ため、部分的な結果と一致しないように、検索クエリが必ずaで終わるようにする必要があります-コメントを参照してください。

%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.

そこにあるサブディレクトリも解析されませんが、他のすべての結果は表示されます。


ありがとう、それが役に立つ答えだということに同意してください。無関係なことに、あなたがたった一つの答えを投稿しただけで、100日間連続してスーパーユーザーを訪問するための「Fanatic」バッジがあることに戸惑っていました。ブックマークされたサイトなどがありますか?
失策14

バッジは2010年に私が事実上潜んでいたときに授与されましたが、SOの方がはるかに積極的です:stackoverflow.com/users/31532/dan-atkinson。:)
ダンアトキンソン14

4

PowerShellを使用した詳細な回答を次に示します(Windows XPではPowerShellをインストールする必要があります)。

こんにちは、Scripting Guy!Windows PowerShellを使用して、ファイルのコレクションで使用されている一意のファイル拡張子を取得する方法はありますか


1
PowerShellはコマンドラインよりもはるかに簡単ですが、.NETに基づいています。残念ながら、これは「ドットネットをインストールする必要はありません」に反します。
ボブ

1
+1 @RichardM:ボブに同意します。また、検出された拡張機能インスタンスのカウントに関連するコード(PowerShellについて何も知らない)は、非常に多くのメモリを消費します。つまり、すべてのインスタンスのカウントを保持するのではなく、各拡張機能の拡張機能の重複インスタンスを格納する配列を作成し、最後に各拡張機能配列のカウントを実行すると信じていますが、これは非常に奇妙な方法のようです拡張インスタンスをカウントします。何か不足していますか?(そうは言っても、最初のPowerShellワンライナーはすてきです。ドットネットが嫌いでなければ試してみます。)
失敗

1
それは公正です。この質問は、PowerShellソリューションに対してよりオープンな検索者を引き付ける可能性があります。まあ、まともなGoogle検索でも上記のリンクが見つかります。
リチャードM

3
このリンクの+1。間違いはすべてが.netを嫌うのは明らかですが、上記の解決策がこの問題に対する最良の長期的な解決策であることを意味するものではありません。言語が多ければ多いほど良いと思います。
スティーブラスボーン

1
PowerShellを使用して、再帰検索に対処する別のリンクを次に示します。robertbigec.wordpress.com/2011/01/07/…– goodeye 13
1

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.PDF.JPG.gif.jpegが含まれていました(改行は関係ありません)。 .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb

これをプロジェクトに使用することができました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.