Powershellで数日分のファイルを残してすべて削除したいときのコマンドを紹介します。
運用系の仕事をしている人や構築する際に、スクリプトで出た一時ファイルやログなどをすべて削除したいときがあります。例えば、1ヶ月以前・1週間以前分のファイルはすべて削除する、と言った具合です。
コマンド
更新日時が1週間以上前のファイルを削除する場合以下のように書きます。作成日時を指定したい場合はLastWriteTimeをCreationTimeに変更すれば同様に動きます。
- 指定フォルダ配下を再帰的に確認して該当するファイルおよびフォルダを削除
1 |
Get-ChildItem $DIRECTORY -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-7))} | Remove-Item -recurse -force |
また、ファイルのみ or フォルダのみ の削除を行いたい場合は、where-object の検索条件にファイルかフォルダを指定すれば良い。
具体的には以下。
- ファイルを指定する場合
1 |
Get-ChildItem -Recurse | Where-Object {($_.Mode -eq "-a----") -and ($_.CreationTime -lt (Get-Date).AddDays(-7))} | Remove-Item -recurse -force |
- フォルダを指定する場合
1 |
Get-ChildItem -Recurse | Where-Object {($_.Mode -eq "d-----") -and ($_.CreationTime -lt (Get-Date).AddDays(-7))} | Remove-Item -recurse -force |
いずれにしてもワンライナーで書けますね。Foreach を使っても書けますが、こちらの方がスマートだと思います。
以下のように変数を入れれば汎用的に使えます。
1 2 3 |
$DIRECTORY = FolderName $DAYS = 7 Get-ChildItem $DIRECTORY -Recurse | Where-Object {($_.Mode -eq "-a---") -and ($_.LastWriteTime -lt (Get-Date).AddDays(-1 * $DAYS))} | Remove-Item -recurse -force |
以下にコマンドの内容詳細を説明します。
- Get-ChildItem
フォルダ内に存在するファイルの一覧を取得・表示します。Linuxで言うところのlsですね。 - Where-Object
検索条件を指定します。and / or 検索も可能。 - Remove-Item
その名の通り、削除コマンドです。-recurse -force で再帰的にかつ強制的に実行します。
まとめ
Poweshellはとても便利なのですが、コマンドが覚えられないので(tab補完はありますが限界があります・・・)
今回の記事の内容もLinuxであれば以下のコマンド一発です。フォルダであったりファイルであったり、を区別する必要がありません。DIRECTORYを指定しない場合は現在の設定を上書きします。
1 |
rm -rf $DIRECTORY |
この記事がお役にたちましたらシェアして頂けるとうれしいです。