PHPで書かれたWebサイトをリニューアルすることになったのですが、ディレクトリ(フォルダ)の中には現在未使用になっているCSSや画像などがたくさんあるとのこと。
完全リニューアルするなら、フルスクラッチするつもりで新しい環境を作成してしまえばいいかもしれませんが、今回は部分リニューアルなので、今の環境を書き換えていくことになります。
となれば、不要なファイルは取り除いておきたいので、まずはサイトで使用している画像を洗い出して一旦退避させようと思ったのですが…。
Linuxならgrepを使えば簡単に探せるものの、Windowsではどうしたらよいものか。いろいろ調べてみたのでメモメモです。
findstrを使う
ひとつのPHPファイルの中から、画像ファイルの記述を探すなら、findstrでいけそう。例えば、index.phpの中に記述されているPNG形式の画像を探す場合。
type index.php | findstr .png
今のフォルダにある全てのPHPファイルからWebP形式の画像を探すなら。
type *.php | findstr .webp
今のフォルダにある全てのPHPファイルからPNG形式とWebP形式の画像を探すなら。
type *.php | findstr ".png .webp"
ただし、findstrは行単位でしか取り出せないため、「画像ファイル名だけを取り出す」ことはできません。
Select-Stringを使う
PowerShell版grepとも言えるSelect-Stringを使えば、もっと細かい指定が可能になります。
まずはfindstrと同じ、index.phpの中に記述されているPNG形式の画像を探す場合。Select-Stringはデフォルトで行番号も出力してくれます。
Select-String ".png" index.php
今のフォルダにある全てのPHPファイルからWebP形式の画像を探すなら。
Select-String ".png" *.php
今のフォルダにある全てのPHPファイルからPNG形式とWebP形式の画像を探すなら。
Select-String -Pattern "(.png|.webp)" *.txt
ここからはfindstrではできないこと。
今のフォルダにある全てのPHPファイルからPNG形式とWebP形式の画像を探し、画像ファイル名をパス付で出力する。
Get-ChildItem *.php | Select-String -Pattern '[^"\s]+?\.(png|webp)' -AllMatches | ForEach-Object { $_.Matches.Value }
指定したフォルダとその配下にある全てのPHPファイルから、指定したフォルダとその配下に存在するPNG画像が指定された行を探すなら。フォルダ名はそれぞれ環境に合わせて変更する。同じファイル名が存在した場合に、どちらが使用されているかは検索結果から判断。
Get-ChildItem "C:\php_files" -Recurse -Filter *.php | Select-String -Pattern (Get-ChildItem "C:\png_files" -Recurse -Filter *.png | ForEach-Object { $_.Name })
さいごに
今のところ、必要とする機能はこれで足りたので、それ以上調べることはしていないのですが、Windows PowerShell上ではもっと細かい指定や処理ができそうな感じ。
軽く調べた感じ、わざわざLinux上でシェルスクリプトを組みながらやってきたようなことも、Windows PowerShellで置き換えてしまうことができそうだと、今さらながら気が付きました。
ということで、今回は「Windows PowerShellでgrepのような処理をしてみる」という手順についてのメモでした。
今日の作業は以上です。お疲れ様でした!
コメント