忍者ブログ

空フォルダを消すクリーナバッチを再改良

2024年01月12日
昔かかった号令の影響で、NAS上に空フォルダがいっぱいの案件がある。

案件フォルダの雛形として、フォルダが用意されているものの、中身がなかったりする。

探し物をしてるとこれが実に腹立たしくて、一括で消してやりたくなった。

今回はバッチファイルでサブフォルダを含めて空のフォルダを削除するバッチについて


先に謝っておくと、NAS上のフォルダを削除する目的で作ったものの、実際にNASで動かすとアクセスが拒否されてうまくいかない。。。

まあでも、ローカル環境では狙い通りの動作をしてくれたのでひとまず共有。




●空フォルダ削除
for /d %%A in (*) do rm "%%A"

バッチファイルのあるフォルダ内の全フォルダを変数として取得して、削除を実施。
Windowsのコマンドの仕様で、フォルダが空じゃないと削除しない。

ちなみにディレクトリの削除はrmじゃなくてrdだった。。。




●サブフォルダを含めて空フォルダを削除
for /r /d %%A in (*) do (
rd "%%A"
)

for文に/rのオプションを付けることで、全サブフォルダを対象にしてくれる。
ただ、上位の階層から順に削除を試みるので、階層が複数あると最下層しか消してくれない。

例によってまたBingAIに依頼。
削除可能なフォルダがなくなるまで繰り返して。

カウントをする処理はやってくれたけど、アルゴリズムがめちゃくちゃだったので手作業で修正。
ただ、一から調べてソースを直すより圧倒的に簡単にできた。

完成したソースがこちら。



tree /f >delEmptyLog.txt
::@echo off

set count=0
:loop
set count0=%count%
set count=0
for /r /d %%A in (*) do (
rd "%%A"
set /a count+=1
)

tree /f >> delEmptyLog.txt
if %count%==%count0% goto end
goto loop
:end


以下は、BingAIのソースコード解説。

このバッチファイルでは、rd "%%A"コマンドで削除できるフォルダがなくなるまで、指定したフォルダ内の空フォルダを削除します。set /a count+=1によって、削除したフォルダ数をカウントします。if %count%==0 goto endによって、削除処理が終了した場合に、処理を終了します。

補足
指定したフォルダ内の全検索を階層数分だけ繰り返し行うので、
上位の階層の空フォルダの削除には時間がかかるので要注意。

treeコマンドで、どういう順に削除されるか表示してみた。
実際に使用する場合は、treeコマンドを削除したうえで
echo offの行にある::のコメントアウトを削除して非表示にする。


実行結果はこんな感じ

フォルダー パスの一覧
ボリューム シリアル番号は 4270-BB9E です
C:.
│ delEmptyLog.txt
│ del_Enptyfolder_R3.bat
│ testtree.txt
│ tree2d.txt

├─1階層目
│ ├─2階層目
│ │ ├─3階層目
│ │ │ ├─4階層目
│ │ │ └─test
│ │ │ ├─a
│ │ │ └─b
│ │ └─test
│ │ ├─a
│ │ └─b
│ └─test
│ ├─a
│ └─b
└─他のフォルダ
│ tree2d.txt

├─test
│ ├─a
│ │ └─aa
│ └─b
│ └─bb
└─test2
├─a
│ └─aa
└─b
└─bb
フォルダー パスの一覧
ボリューム シリアル番号は 4270-BB9E です
C:.
│ delEmptyLog.txt
│ del_Enptyfolder_R3.bat
│ testtree.txt
│ tree2d.txt

├─1階層目
│ ├─2階層目
│ │ ├─3階層目
│ │ │ └─test
│ │ └─test
│ └─test
└─他のフォルダ
│ tree2d.txt

├─test
│ ├─a
│ └─b
└─test2
├─a
└─b
フォルダー パスの一覧
ボリューム シリアル番号は 4270-BB9E です
C:.
│ delEmptyLog.txt
│ del_Enptyfolder_R3.bat
│ testtree.txt
│ tree2d.txt

├─1階層目
│ └─2階層目
│ └─3階層目
└─他のフォルダ
│ tree2d.txt

├─test
└─test2
フォルダー パスの一覧
ボリューム シリアル番号は 4270-BB9E です
C:.
│ delEmptyLog.txt
│ del_Enptyfolder_R3.bat
│ testtree.txt
│ tree2d.txt

├─1階層目
│ └─2階層目
└─他のフォルダ
tree2d.txt

フォルダー パスの一覧
ボリューム シリアル番号は 4270-BB9E です
C:.
│ delEmptyLog.txt
│ del_Enptyfolder_R3.bat
│ testtree.txt
│ tree2d.txt

├─1階層目
└─他のフォルダ
tree2d.txt

フォルダー パスの一覧
ボリューム シリアル番号は 4270-BB9E です
C:.
│ delEmptyLog.txt
│ del_Enptyfolder_R3.bat
│ testtree.txt
│ tree2d.txt

└─他のフォルダ
tree2d.txt

フォルダー パスの一覧
ボリューム シリアル番号は 4270-BB9E です
C:.
│ delEmptyLog.txt
│ del_Enptyfolder_R3.bat
│ testtree.txt
│ tree2d.txt

└─他のフォルダ
tree2d.txt

フォルダー パスの一覧
ボリューム シリアル番号は 4270-BB9E です
C:.
│ delEmptyLog.txt
│ del_Enptyfolder_R3.bat
│ testtree.txt
│ tree2d.txt

└─他のフォルダ
tree2d.txt



ちなみにソースコードにコメントを書かせようとしたけど、バッチファイルの作法を無視して今日の途中からコメントを入れやがる。
当然、挙動が変わって使い物にならなかった。


動作確認する際には、バッチファイルと同じ階層に試験対象フォルダを置いて、事前にZip化しておくと、条件を変えて試験しやすい。

PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字