Lumeで余計な画像ファイルを削除する
3 min read
こんにちは、無能です。
元々WordPressから移行し、自分で作成したシェルスクリプトでビルド時にwebp
変換まで行っています。
そうなると、変換前の画像ファイルは不要になりLumeCMSで記事編集中にアップロードしようとすると全ての画像ファイルを読み込もうとして遅くなってしまいます。
後のLumeCMS自体のアップデートで改善されるかもしれませんが、この不要な画像ファイル自体そもそもいらないので削除したいですね。
どれほどファイル差があるか
実際にビルド後のhtmlファイルのタグに存在する画像ファイルと、ソース元側にある画像の差分を見てみましょう。
ビルド後の実際に使われている画像ファイル
$ cd Lumeのビルド後のディレクトリ(htmlファイルが存在してればOK)
$ grep -r "src" 2>/dev/null | sed "s/\"/\n/g"| grep -E "uploads.*(webp|png|jpg|jpeg|svg|gif)" | grep -oP "\/uploads.*" | sort -u | wc -l
649
念の為、grep -vE
で漏れが無いか目grepもしました。
それで、実際のこのサイトで使われている画像ファイルは649
ファイルでした。
ビルド後のhtml
ファイルはワンライナーで出力されるので、grep
しやすいようにダブルクウォート区切りで改行しその後に拡張正規表現で画像ファイルを抽出し、その後整形します。
ビルド前に存在する画像ファイル
$ cd ビルド前の画像アップロードフォルダ
$ ls | wc -l
1913
なんと1264
も実際には使われていない画像ファイルが存在するではありませんか!
※ちゃんとやるならfind
でやりましょう。
実際に削除する
という訳で、grep
とxargs
を使ってこの差分を表示するようにしました。
$ cat rmpic.sh
#!/bin/bash
set -x
RM_PICDIR="/var/www/html/soulmining/src/uploads"
USE_SRCDIR="/var/www/html/soulmining/site"
cd $USE_SRCDIR || exit 2
USEPIC=$(grep -r "src" 2>/dev/null | sed "s/\"/\n/g"| grep -E "uploads.*(webp|png|jpg|jpeg|svg|gif)" | grep -oP "\/uploads.*" | sort -u | awk -F/ '{print $3}')
cd $RM_PICDIR || exit 2
find -type f | awk -F/ '{print $2}' | grep -vFf <(echo "$USEPIC") | xargs -I {} -r echo "Junk file: {}"
echo "Done"
set +x
find
コマンドを使用するときはいつも怖いので、削除したいディレクトリに移動出来なかったら戻り値2を返して終了します。
これで再度echo
した使用されていないファイルを一通り目grepと実際のビルド後のディレクトリでgrep -r "file"
でざっくり見てから使われていないことを確認し以下の様に編集し実行します。
xargs -I {} -r rm {}
に変更したのと、デバッグモードを消しました。
#!/bin/bash
RM_PICDIR="/var/www/html/soulmining/src/uploads"
USE_SRCDIR="/var/www/html/soulmining/site"
cd $USE_SRCDIR || exit 2
USEPIC=$(grep -r "src" 2>/dev/null | sed "s/\"/\n/g"| grep -E "uploads.*(webp|png|jpg|jpeg|svg|gif)" | grep -oP "\/uploads.*" | awk -F/ '{print $3}')
cd $RM_PICDIR || exit 2
find -type f | awk -F/ '{print $2}' | grep -vFf <(echo "$USEPIC") | xargs -I {} -r rm {}
echo "Done"
一応、git
で管理しているおかげで、git reset --hard コミットハッシュ値
から戻すことも容易で自宅サーバへのUSBにもバックアップされているので実行します(ドキドキ)
$ ./rmpic.sh
Done
成功です!
という訳で、ビルド用スクリプトにこれも実行するように入れておきました。
それではまた。
よろしくお願いします。