web-dev-qa-db-ja.com

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

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

OSはWindowsですXP現在のすべての更新が含まれていますが、それが何をしているかを伝えることができればスクリプトを実行しても大丈夫ですが、ドットネットをインストールする必要はないので、本当にそれが好きではありません。

29
blunders

このバッチスクリプトはそれを行います。

@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コマンドを介して送信された場合、現在のリスト全体。 findコマンドのテキスト出力はnulに送信されます。これは基本的にブラックホールです-必要ありません。リストの最後に常に:を追加するため、検索クエリが:で終了するようにして、部分的な結果と一致しないようにする必要があります。コメントを参照してください。

%ERRORLEVEL%はfindコマンドによって設定され、値0は一致があったことを示します。したがって、それが0でない場合、現在の拡張子はこれまでのところリストにないため、追加する必要があります。

エコー行は基本的に出力し、プレースホルダー(:)を改行で置き換えて見栄えを良くしています。

29
Bob

バッチスクリプトの要件を厳密には満たしていませんが、1行の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.

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

20
Dan Atkinson

変更すると便利だと思いました

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

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

0
Steev43230

使用中のパスの下にあるcmdのすべての固有の拡張機能をリストするには:

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