こんばんは。不可思議絵の具です。
私儀都合(エチチ画像整理)のため、空フォルダを一括削除するPowerShellスクリプトを作りましたので、サンプルとして公開します。
指定フォルダ以下を全て辿り、中身が空っぽのフォルダを片っ端から(再帰的に)削除します。
「片っ端から」は↓こんな動きです。
C:¥A
(「Cドライブ」の親フォルダ「A
」)C:¥A¥1
(子フォルダ「1
」)C:¥A¥1¥x
(孫フォルダ「x
」)
たとえば、こんな構造のフォルダがあったとき。
(\
は¥記号で読み替えて下さい)
- ルール①:フォルダ階層が全てカラなら全て削除する
「C:¥A
」▶「C:¥A¥1
」▶「C:¥A¥1¥x
」と中身を辿っていった結果、
これらの中身が全てカラだったら、
「C:¥A
」「C:¥A¥1
」「C:¥A¥1¥x
」を全て削除します - ルール②:一番深い階層がカラのときだけ削除する
「C:¥A¥1
」に何かファイルがある場合は「C:¥A¥1¥x
」だけ削除します。
完全に自分用なので安全対策処理はおろか、エラー処理も無い危険なシロモノですが、
「シンプルで素直な作りなので、PowerShellスクリプトのたたき台に良いかな?」
と思ったので公開します。
一応、約1.8万ファイル・約2,700フォルダ・約13GB分の虎の子エチチファイルを使い命がけでテストしたので、おおかた大丈夫でしょうw
くどいですが自分用で、内容についてお問い合わせ頂いてもお答えはできませんし、詳細に解説する気もありません。
(バグ報告は歓迎です)
あくまで、
- 自分でプログラムを読めて
- 自分で意味を理解して
- 自力で実行できる
「プログラマーさん」に向けて公開しております。
この後の文章も、そういった方に向けて遠慮無く書いておりますのでご了承ください。
サンプルスクリプト
下記テキストを「【任意の名前】.ps1
」として保存してください。
#削除対象フォルダ(ここから下の空フォルダを削除する)
$TARGET_ROOT = "E:\Share\LocalSync\壁紙"
#除外ファイル(これらファイルは存在しないものとみなす)
$EXCLUDES = @("Thumbs.db", ".nomedia", "_filemany.simDB")
Write-Host "`n----- 開始 -----" -ForegroundColor Green
#並びを逆にする = フォルダの深い順に並べ替える
$targets = Get-ChildItem -Path $TARGET_ROOT -Directory -Recurse | Sort-Object -Descending
foreach ($target in $targets) {
#除外ファイル以外のファイル数が0なら削除
$items = Get-ChildItem -Path $target -Exclude $EXCLUDES -Recurse
if ($items.Count -eq 0) {
Write-Host "Delete: $target"
Remove-Item $target -Recurse -Force #Forceで隠しファイルもろとも削除
}
}
Write-Host "----- 終了 -----" -ForegroundColor Green
使い方
動作概要
$TARGET_ROOT
に指定されたフォルダを起点に、全ての空フォルダを再帰的に削除します。- このとき、
$EXCLUDES
に含まれたファイルは「存在しない物」としてみなします。
(これらのファイルが存在していてもフォルダを削除する) - また、
$EXCLUDES
が「隠しファイル」や「システムファイル」であっても無視します。
(Remove-Item
の-Recurse
オプション)
設定
項番 | 項目 | 内容 |
---|---|---|
1 | $TARGET_ROOT |
削除対象フォルダ。 このフォルダ以下の空フォルダを再帰的に削除します。 「C:\」など、ドライブ指定は危険なので避けましょう |
2 | $EXCLUDES |
除外ファイル。 ドットファイルやThumbs.dbなど、フォルダもろとも削除して良いファイルを配列形式で指定します。 |
この2項目を設定した後、スクリプトを実行します。
簡易解説
コテコテの順次実行
私自身PowerShell初心者なので、パイプを極力使わない、コテコテな構造型言語の処理フローになっています。
やってることは
- 処理対象フォルダの列挙
- それらのファイル数を確認しながら、ゼロなら削除
これだけです。
Where-Object
や Select-Object
を駆使する上級者のコードに比べ、かなり取っつきやすいのではないでしょうか。
再帰処理もどき
動作概要で「再帰的に削除」と書きましたが、実際は再帰的に処理していません。
Sort-Object -Descending
としてフォルダ一覧の並び順を逆にすることで、結果的に「深いフォルダ」から順に削除される形になっています。
試験実行するときは
Remove-Item $target -Recurse -Force
をコメントアウトし、
Write-Host $target
とすると事前に対象フォルダを確認できます。
ただ、実際の削除が行われないため、「再帰的な削除」の動きは確認できません。
さいごに
以上、空フォルダを一括削除するPowerShellスクリプトの紹介でした。
反応が良ければWindowsアプリにしようかな?
では(^o^)/