未参照の画像を探すためのスクリプトをPowerShellで書いた

photo by Irish Defence Forces

はじめに

未参照と思われる画像がプロジェクト内に数十ファイルあり、手でいちいちGREPして未参照を確認するのが面倒なので、PowerShellの勉強も兼ねて作成。

'指定されたフォルダ内のファイル名を再帰的に取得し、'
'検索対象のフォルダを再帰的にGREPします'

$sourceFilesPath = Read-Host 'GREPしたいファイルが格納されているフォルダを指定してください。'
$targetFilesPath = Read-Host 'GREPをかけるフォルダを指定してください。'

"検索してます。。。"

# ファイル一覧を取得、ファイル名称のみ、フォルダは除外。
$fileNameLists = Get-ChildItem "$sourceFilesPath" -Recurse | Where-Object { ! $_.PsIsContainer } | Select-Object Name, Fullname

foreach($i in $fileNameLists)
{
    echo "$i.Fullname をGREPします。" 
    # この指定方法だとフォルダもオブジェクトとして取得してたりするが、実害(パフォーマンスへの影響)がないので放置。
    $result = Get-ChildItem "$targetFilesPath" -Recurse | Select-String $i.Name -Encoding default
    if ($result.Count -eq 0)
    {
        '検索にヒットしないです。'
    } 
    else 
    {
        $result
    }

    # 見やすさのために3つ改行させる。
    echo "  " 
    echo "  " 
    echo "  " 
}

'おわった!'

やっていることは以下の自動化。

  1. GREPしたいファイルの名称をコピー。
  2. エディタの検索機能を使ってGREP
  3. フォルダを登ったり降りたりしながら別のファイルの名称をコピー。
  4. エディタのー(以下略)

このスクリプトを利用すると、フォルダを指定することにより、GREPを書ける条件(ファイル名)を再帰的に取得してGREPを掛けてくれるので、手でやる時みたくフォルダを行ったり来たりしなくて良い。

なお、タイトルでは画像と言っているけど、別に画像の拡張子で絞ったりはしていないので、スクリプトでもhtmlでもバイナリでもファイルなら名称で検索する。

改善点とか

存在しないフォルダを指定された時などのエラー処理やってない。

あくまで名称のみで検索しているので、ファイル名が同一だけど階層が違う場合などでも検索にヒットする。これは自分のプロジェクトでは画像名称はユニークだったので対応していない。