Lume에서 불필요한 이미지 파일 삭제하기
안녕하세요, 무능입니다.
원래 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로 누락된 부분이 없는지 눈으로도 확인했습니다.
그래서 실제 이 사이트에서 사용되는 이미지 파일은 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
성공입니다!
그래서 빌드 스크립트에 이것도 실행하도록 넣어두었습니다.
그럼 다음에 또 뵙겠습니다.
잘 부탁드립니다.