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でやりましょう。

実際に削除する

という訳で、grepxargsを使ってこの差分を表示するようにしました。

$ 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

成功です!

という訳で、ビルド用スクリプトにこれも実行するように入れておきました。


それではまた。
よろしくお願いします。

PGP --- Contact --- Machines