バッチファイル(ファイル操作_6_ファイルサイズ確認4)

■大量のファイルのファイルサイズを確認するための修正。
前回の続き。前回のバッチは、dir /s /b /a-d でファイルのフルパスを取得した後、1行ずつdir [ファイルのフルパス]でファイルサイズを表示させていた。けど、dirで配下のフォルダのファイルも含めてファイルサイズを得られたので、1行ずつdirを実行する部分を省略する。

修正したバッチが下のもの。

echo off

echo %time%
set /a n=0
set /a SHOW_MORETHAN_FILESIZE=1000000

setlocal enabledelayedexpansion 
for /f "delims=" %%A in ('"dir %1 /s /-C /a-d | findstr "2022 2021""') do (
  set "line[!n!]=%%A"
  set /a n=n+1
)

set /a l=n-1
for /l %%m in (0,1,%l%) do (
   set tempfile=!line[%%m]:~17,18!
   if !tempfile! gtr %SHOW_MORETHAN_FILESIZE% (
     echo !line[%%m]!
   )
)

echo %time%

オプションの/b (ファイル名のみを表示)を削除し、新しく/-C (/Cがファイルサイズの桁区切り表示で既定、/-Cで区切り表示なし)を新しく設定。また、ファイル作成の日付が入っている行だけを表示させるようfindstrを使用。前回までfindを使っていたけど、複数のキーワードではできないよう。考えてみると、サンプルは最近作ったファイルなので2022年のものしかないけど、実際のファイルは、パソコンを使い始めた年以降の複数の年があるので、複数の年をキーワードとして検索する必要がある。

前回と同様に、30、300、3000のファイルに対して、時間を計測してみると、下表のようになった。隣の括弧内の数値は前回の結果。

ファイル数1回目 (秒)2回目 (秒) 3回目 (秒)
30(10ずつ)0.1 (1.9)0.1 (1.8)0.1 (1.6)
300(100ずつ)0.2 (24.6)0.2 (20.7)0.2 (22.2)
3000(1000ずつ) 9.1 (389.3)8.1 (396)8.0 (352)

不要な処理を削除したので速くなるのは当然だけど、かなり速くなったように見える。

これでユーザー配下のファイルに対してもファイルサイズを確認する。
自分の環境では、79GBで15万ファイルほどある。ここに対して100MB以上(上のバッチで、 SHOW_MORETHAN_FILESIZE = 100000000として設定)のものを探してみた。

4時間くらいかかったけど、無事終わりまで動かすことができた。ただ、2022や2021だけで検索しているので、その文字列が入ったディレクトリやたまたまバイト数に2022などが含まれる場合も表示されてしまう。見たいファイルは、文頭からyyyy/mm/ddのフォーマットとなっているので、検索条件を工夫すれば除外できそう。

ファイルサイズの確認のバッチについてはこのくらいかな。