2023年4月18日火曜日

Powershellで空のフォルダを一括削除する

ファイルをディレクトリを掘って分類して保存していると、よく起こるのが、ディレクトリ開けてみたら空っぽでムカつく問題。

GUI上で開けてみないとディレクトリがからなのは分からないので地味に怠いですよね。そんな時はPowershellで空っぽのディレクトリを削除してしまいましょう。

1.空のサブディレクトリを削除するスクリプト

以下のスクリプトは、指定したディレクトリ配下のすべてのサブディレクトリをチェックし、ファイルが含まれていない場合にディレクトリを削除します。

注意(超重要):このスクリプトは、手元で簡単に動作確認はしているもののあらゆる環境、ファイルの文字コードや特殊文字の影響、パスが長すぎる場合の動作、アクセス権限や読み取り専用設定、システムファイルへの影響、フォルダ構成が複雑な場合に正しく動作するか等々、各種要因で想定外の動作をする可能性があります。また、環境差分による動作の違いがあったりする可能性も否定できません。ディレクトリを削除するため万一想定外の動作をすると、通常の手順では基本的にファイル復旧は出来なくなります。
実行前に必ず対象ディレクトリ内の重要なファイルがないことを確認してください。また、実行する前に十分テストをした上で念のため対象フォルダ以下全体のバックアップを取ることをお勧めします。

function Remove-EmptyDirectories {
    param (
        [string]$Path
    )

    $removed = $false

    Get-ChildItem -Path $Path -Recurse -Directory | Sort-Object -Property FullName -Descending | ForEach-Object {
        if (-not (Get-ChildItem -Path $_.FullName)) {
            Remove-Item -Path $_.FullName -Recurse -Force
            Write-Host "Removed empty directory: $($_.FullName)"
            $removed = $true
        }
    }

    if ($removed) {
        # 件数が多いと1回で処理しきれずまだ空のディレクトリが残っている可能性があるので、再帰的に実行
        Remove-EmptyDirectories -Path $Path
    }
}

$targetDirectory = "C:\tmp"
Remove-EmptyDirectories -Path $targetDirectory

スクリプトの動きは概ね次の通りです。

①Remove-EmptyDirectories 関数を定義します。この関数は、指定されたパスのディレクトリ内にある空のサブディレクトリを削除します。

②関数の中で、Get-ChildItem コマンドレットを使用して、指定されたパスのサブディレクトリを再帰的に取得します。-Recurse オプションにより、サブディレクトリ内のサブディレクトリも検索対象に含まれます。

③取得したディレクトリを Sort-Object コマンドレットを使用して、フルパスの降順でソートします。これにより、最も深い階層のディレクトリから順に処理されるようになります。

④ForEach-Object を使用して、各ディレクトリに対して次の処理を行います。

a. Get-ChildItem コマンドレットを使用して、ディレクトリ内のアイテム(ファイルやサブディレクトリ)を取得します。

b. アイテムが存在しない場合(空のディレクトリの場合)、Remove-Item コマンドレットを使用してディレクトリを削除します。

c. 削除されたディレクトリのフルパスを標準出力に出力します。

⑤空のディレクトリが削除された場合($removed が $true の場合)、関数自身を再帰的に呼び出して、残りの空のディレクトリが削除されるまで実行を続けます。

⑥最後に、ターゲットとなるディレクトリを指定し、Remove-EmptyDirectories 関数を呼び出します。

2.スクリプトの保存と実行

上記のスクリプトをテキストエディタで開き、例えば「RemoveEmptyDirs.ps1」という名前で保存します。保存したスクリプトを右クリックし、「PowerShellで実行」を選択するか、PowerShellコンソールでスクリプトのパスを指定して実行します。

※もちろんファイルを作成せずPowershellのウィンドウにコピペでも構いません。

まとめ

PowerShellを使って空のサブディレクトリを自動的に削除することで、ディレクトリ開けてみたら空っぽでムカつく問題を回避できます。このスクリプトは簡単にカスタマイズ可能であり、定期的に実行することで、常に整理されたディレクトリ構造を維持することができます。

なお実際にとっ散らかりまくった私のディスクで再帰実行無しのスクリプトで試してみたところ、あまりにも削除対象となる空のディレクトリが多いと1回では消し切らない様でした。とほほ。なので再帰関数にしています。

参考:スクリプト実行結果イメージ

PS C:\> function Remove-EmptyDirectories {
>>        param (
>>            [string]$Path
>>        )
>>    
>>        $removed = $false
>>    
>>        Get-ChildItem -Path $Path -Recurse -Directory | Sort-Object -Property FullName -Descending | ForEach-Object {
>>            if (-not (Get-ChildItem -Path $_.FullName)) {
>>                Remove-Item -Path $_.FullName -Recurse -Force
>>                Write-Host "Removed empty directory: $($_.FullName)"
>>                $removed = $true
>>            }
>>        }
>>    
>>        if ($removed) {
>>            # まだ空のディレクトリが残っている可能性があるので、再帰的に実行
>>            Remove-EmptyDirectories -Path $Path
>>        }
>>    }
PS C:\>
PS C:\> $targetDirectory = "C:\tmp"
PS C:\> Remove-EmptyDirectories -Path $targetDirectory
Removed empty directory: C:\tmp\003
Removed empty directory: C:\tmp\001\新しいフォルダー
Removed empty directory: C:\tmp\001\新しいフォルダー (2)
PS C:\>

0 件のコメント:

ウェブサイトのURLにおけるトレイリングスラッシュの解釈と有無による動作の違い

インターネットが現代社会におけるコミュニケーションの基盤となっている今日、ウェブサイトのURLはビジネスや個人ブランディングにとって重要な役割を果たしています。URLは単にウェブページへの経路を示すだけでなく、SEO(検索エンジン最適化)においても重要な要素です。この記事では、U...