適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

【PowerShell】色々な条件でファイルを検索する【Get-ChildItem】

ディスクにファイルがいっぱいになってしまった・・・。

整理するにも、どこからてを手を付けていいかわからない・・・。

また、ファイルを検索しても見つからない・・・。

多分、このくらいの日にちで更新はしたような気がする・・・。

エクスプローラーだと見つからない。。。、

フリーソフト入れたいけど、ポリシー的に入れられない・・・。

そんなときは、PowerShellを使ってサクッと色々な切り口でファイルを検索しファイルを発見する糸口を見つけてみてはどうでしょうか。

検証した環境

Windows10
PSVersion 5.1

Get-ChildItemコマンドレットとWhere-Objectコマンドレットを組み合わせる

Get-ChildItemコマンドレットとWhere-Objectコマンドレットをパイプラインで組み合わせることで様々な切り口でファイルを検索することができます。

1年以上更新されていないファイルを調べる

例えば1年以上更新されていないファイルは削除してもいいのではないでしょうか・・・?

 
Get-ChildItem -LiteralPath 'C:\' -Recurse |Where-Object{$_.LastWriteTime -lt (Get-Date).AddYears(-1)}

いや、1年は早すぎるでしょ、というときは、(Get-Date).AddYears(-1)の-1を任意の負数に変更します。

例えば5年以上更新がないファイルを検索したいときは次の通り。

 
Get-ChildItem -LiteralPath 'C:\' -Recurse |Where-Object{$_.LastWriteTime -lt (Get-Date).AddYears(-5)}

このワンライナーのキモは、更新日を示すプロパティであるLastWriteTimeプロパティを比較しているところです。

5年以上アクセスされていないファイルを調べる

更新日ではなく、ファイルにアクセスした日にちで比較したい場合はLastAccessTimeプロパティを使うのもいいですね。

 
Get-ChildItem -LiteralPath 'C:\' -Recurse |Where-Object{$_.LastAccessTime-lt (Get-Date).AddYears(-5)}

System.DateTimeオブジェクトで自由に日にちを設定する

Get-Dateコマンドレットは今時点の日時を返してくれます。

Get-Dateコマンドレットについては下記の記事をご参照ください↓

【Get-Date】PowerShellで日付を扱う方法の解説 - 適材適所

戻り値の型はSystem.DateTimeです。

System.DateTime型には日時を計算する様々なメソッドが用意されています。

その多くはAdd~という名前のメソッドです。

どんなメソッドがあるかは下記のコマンドを実行すると確認することができます。

 
[System.DateTime].DeclaredMethods|Where-Object{$_.name -like 'Add*'}|Select-Object name

今回は、この中のAddYearsメソッドを使っています。

AddYearsは年を加算するメソッドですが、負数を指定することで、減算することも可能です。

例えば次の通り。

 
#2016年11月10日 0:09:38
(Get-Date).AddYears(-5)

AddYears以外にも他のメソッドを使って日付を計算することでよしなに古いファイルを抽出することができます。

抽出したファイルをサイズ順にする

「古いファイルは抽出できた。でもこの中の重いファイルを優先的に削除していこう!」

そんなときはファイルをサイズ順に並べ替えてあげましょう。

並び替えは、Sort-Objectコマンドレットの出番です。

 
Get-ChildItem -LiteralPath 'C:\' -Recurse |Where-Object{$_.LastAccessTime-lt (Get-Date).AddYears(-5)}|Sort-Object length

これでファイルサイズ順になります。

lengthの部分を別のプロパティにすることで自由に並び順を変えることができます。

検索するファイル名も指定したい

検索するファイル名も指定したい場合があるかもしれません。

そういうときは、

 
Get-ChildItem -LiteralPath 'C:\' -Recurse |Where-Object{$_.Name -like 'ゴミ*'}

Where-ObjectコマンドレットでNameプロパティでフィルタをかけてあげます。

上記の例では、ゴミ~というファイル名をもつファイルだけが抽出されます。

*はワイルドカードで曖昧検索をすることができます。

指定の仕方 検索対象
'ゴミ*' ゴミで始まるファイル
*ゴミ* ゴミという文字が入っているファイル
'*ゴミ' ゴミで終わるファイル

ちなみに-like演算子を-match演算子にすると、正規表現で検索することができます。

拡張子で絞る

拡張子で絞りたいときは、Extentionプロパティを比較対象にします。

 
Get-ChildItem -LiteralPath 'C:\' -Recurse |Where-Object{$_.Extention -eq '.txt'}

抽出した一覧をExcelなどで見たい

検索した結果をExcelなどで見たいときは、csv形式にして保存してあげましょう。

csv形式で出力したいときはExport-Csvコマンドレットに渡してあげます。

 
Get-ChildItem -LiteralPath 'C:\' -Recurse |Where-Object{$_.LastAccessTime-lt (Get-Date).AddYears(0)}|Sort-Object length|Export-Csv -Path "C:\list.csv" -Encoding Default -NoTypeInformation

ファイルのパスなどは適宜変更してください。

出力される項目を絞る

「いや、出力されたcsvの情報量多すぎ~~」というときは、Sort-Objectコマンドレットを挟みましょう。

 
Get-ChildItem -LiteralPath 'C:\' -Recurse |Where-Object{$_.LastAccessTime-lt (Get-Date).AddYears(0)}|Sort-Object length|Select-Object Name,FullName,LastWriteTime|Export-Csv -Path "C:\list.csv" -Encoding Default -NoTypeInformation

終わりに

PowerShellを使って色々な切り口で

ファイルを検索するワンライナーを(足早に)紹介してみました。

ファイルを検索するときに様々な条件で検索できると色々と捗ります。

「いや、このワンライナー意味が分からない!!」

そんなときはTwitterでもなんでもお気軽に聞いてください。

というわけで、ここまでお読みいただきありがとうございました。