Search This Blog

Command Prompt CMD Each Folder Size of Current Directory フォルダの容量を確認する

カレントディレクトリのフォルダの容量が知りたいと思い調べて作ってみた。
for /f "tokens=1,* delims=:" %a in ('^(for /d %i in ^(*^) do @echo 1:%~fi^&dir "%i" /a /s^| findstr /e "バイト"^| sort /r^|findstr /n ".*"^)') do @if %a==1 echo %b

かなり強引だと自分でも思う。
こうまでしてOne-linerにする必要はないけれど、できないものでもできそうな気がして、馬鹿みたいな時間を使って考えることが好きなんだ。
いろいろな例を参考にしながら作成したけれど、そうできてなければ今頃まだ考えていただろうと思う。
昨日初めてfor文を試してみたけれど、batはなんとなくめんどくさそうな印象がありこれまでは避けてきていた。WEBにはbatかpowershellのファイル化されたものがいくつかあり、使ったことないし解読も苦労する気がしたので、出来る所まで作って、あとはエディタの正規表現とかで編集すればいいかぐらいの気持ちで作ったもの。だから強引な部品の組合せではあるけれど、動くと思うから不細工なところはご勘弁。

調べたことは

  • For文、If文、findstr、sort
  • 特殊文字の^回避

作成の経緯

フォルダのプロパティを開いての確認では、数が多いときに大変だと感じた。
各フォルダごとに、dir /a /s で末尾に表示される[ファイルの総数]を一覧にするだけのもの。
for文を調べていじって48時間、苦労しながらも作ってやったぜ、ふはは、はは、はわぁ。
batめ、参ったか?

幾つか気になる点

  • Error処理がない。One-linerだもんな。
     確認できたものは、ファイルが見つかりません
      > dir "%i" /a:-d /s こう指定すると、file数が0のときに出る。無視していいもの。
  • Folderのpropertyと少しずれる時がある。
    カレントにあるファイル分がサイズ差になっていただけ。
    カレントのフォルダそれぞれの容量を一覧するためだけのものなので、処理対象ではない。

User files とそれらを格納したFolderの容量を知ることが目的のもの。
dir の結果表示を利用しているので、Sizeが違うとしても、Windowsのdir commandの内部処理。
作りこむとかという話でもないもの。


  1. for /f "tokens=1,* delims=:" %a in ('^(for /d %i in ^(*^) do @echo 1:%~fi^&dir "%i" /a /s^| findstr /e "バイト"^| sort /r^|findstr /n ".*"^)') do @if %a==1 echo %b
  2. 表示を二行一組から一行へと変更したもの(cmd /v:onにて実行) cmd /v:on /c "for /f "tokens=1,* delims=:" %a in ('^(for /d %i in ^(*^) do @echo 0:%~fi^& dir "%i" /a /s^| findstr /e "バイト"^| sort /r^| findstr /n ".*"^)') do @(if %a==0 set p=%~nb)& if %a==1 echo %b,!p!"

[ dir /a /s ] を同一階層のフォルダの全てに実行させるだけなので、表示される結果もコマンド実行時と変わらず、フォルダ名とサイズがそれぞれ別に二行出力される。
一行に表示したほうが編集や目線が容易かと思い、表示を一行へする追加のOne-Linerを作成。

動くものを別の書き方をしたものの記録

cmd /v:on /c ^ "for /f "usebackq tokens=1,* delims=:" %a in (`^(for /d %i in ^(*^) do @echo 0:%~fi^& dir "%i" /a /s^| findstr /e "バイト"^| sort /r^| findstr /n ".*"^)`) do @(if %a==0 set p=%~nb)& if %a==1 echo %b,!p!" cmd /v:on /c "for /f "usebackq tokens=1,* delims=:" %a in (`^(for /d %i in ^(*^) do @echo 0:%~fi^& dir "%i" /a /s^| findstr /e "バイト"^| sort /r^| findstr /n ".*"^)`) do @(if %a==0 set p=%~nb)& if %a==1 echo %b,!p!" cmd /v:on /c "for /f " tokens=1,* delims=:" %a in ('^(for /d %i in ^(*^) do @echo 0:%~fi^& dir "%i" /a /s^| findstr /e "バイト"^| sort /r^| findstr /n ".*"^)') do @(if %a==0 set p=%~nb)& if %a==1 echo %b,!p!" cmd /v:on /c for /f "tokens=1,* delims=:" %a in ('for /d %i in ^^(*^^) do @echo 0:%~fi ^^^& dir "%i" /a /s ^^^| findstr /e "バイト" ^^^| sort /r ^^^| findstr /n ".*" ') do @(if %a==0 set p=%~nb)^^^& if %a==1 echo %b,!p!
なんとなく表示はできてもおかしい気がするもの
for /D %a in (*) do @for /F "tokens=3" %s in ('dir "%a" ^| find "個のファイル"') do @echo %a : %s : %~ta

Reference:
「^」 - DOS コマンド一覧 - Programming Field
cmd.exe のコマンドラインの仕様を解析してみた - 永遠に未完成