
フォルダーとそのサブフォルダー (ディレクトリとそのサブディレクトリ) を横断し、それらのフォルダー内に存在するすべての拡張子について、特定の拡張子のファイルが合計でいくつあるかを一覧表示するにはどうすればよいでしょうか。
これに似たようなもの、
folders 48 total
.jpg 2842 total
.gif 142 total
.CR2 2842 total
上記の合計は、dir/s
あるフォルダー内のすべてのファイルとサブフォルダーをリストした合計と同じである必要があります。
答え1
コマンドラインである必要がない場合は、WinDirStat を使用できます。http://windirstat.info/download.html
答え2
次のコード スニペットが役立つかもしれません:
@ECHO OFF >NUL
SETLOCAL EnableExtensions
rem EnableDelayedExpansion
rem next line: clear/delete all `_filesTotal` environment variables
for /F "delims==" %%G in ('set _filesTotal 2^>NUL') do set "%%G="
rem next line: initialize `_foldersTotal` environment variable
set "_foldersTotal=0"
pushd "folder where count"
for /F "delims=" %%G in ('dir /B /S /A') do (
if exist "%%~G\" (
rem folder %%G
set /A "_foldersTotal+=1"
) else (
rem file %%G
if "%%~xG"=="" (set /A "_filesTotal.+=1") else (set /A "_filesTotal%%~xG+=1")
)
)
rem next two lines: display raw results
echo %CD%
set _foldersTotal
set _filesTotal
popd
リソース(必読):
- (コマンドリファレンス)Windows CMD コマンドラインの AZ インデックス
- (追加の詳細)Windows CMD シェルのコマンド ライン構文
- (
%~G
など特設ページ)コマンドライン引数(パラメータ) - (
>>
など2>NUL
特設ページ)リダイレクション
答え3
質問に対しては、Powershell アプローチを検討することをお勧めします。コード行数が少し少なくなり、出力を並べ替える機能も備わっています...
$foldercount = 0
$hash = @{}
Get-ChildItem -Path "C:\Code Samples" -Recurse | ForEach-Object {
if ($_.Attributes -eq 'Directory')
{
++$foldercount
}
else
{
if ($hash.ContainsKey($_.Extension))
{ $count = $hash.Get_Item($_.Extension); ++$count; $hash.Set_Item($_.Extension, $count) }
else
{ $hash.Add($_.Extension, 1) }
}
}
Write-Host $foldercount folders
$hash.GetEnumerator() | Sort-Object Value -descending
そして、サンプル フォルダーに次の出力が生成されます...
90 folders
Name Value
---- -----
.tlog 186
.h 72
.obj 56
.cpp 54
.pdb 26
.manifest 24
.res 23
.rc 22
.log 15
.lastbuildstate 12
.ipch 12
.ico 12
.exe 12
.idb 12
.vcxproj 11
.ilk 11
.user 11
.sdf 11
.zip 11
.filters 11
.sln 11
.pch 11
.txt 8
.gif 8
.rc2 8
.aps 8
.bmp 7
.dsw 6
.dsp 6
.png 5
.css 5
.html 4
.old 4
.XML 4
.vcproj 4
.xslt 4
.exp 3
.dll 3
.lib 3
.clw 2
.def 2
.opt 2
.ncb 2
.plg 2
.recipe 2
.rtf 1
.jpg 1
.h original 1
.bat 1
.js 1
.cpp original 1
.DPbcd 1
答え4
これは非常にシンプルで効率的なアプローチです
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c