[Typora] 포스트 이미지 깔끔하게 정리
1. Overview
Post (.md) 작성을 해오면서, 다양한 jekyll theme 도 적용해보고
이에 따라 디렉토리나 이미지들이 지저분하게 보관이 되어왔다.
이번 기회에, Post 파일에서 사용되지 않는 Garbage 이미지 파일을 찾아 삭제하고
해당 부분은 NotUsedImageCleaner 에서 다룬다.
assets/img 아래에 저장되는 이미지들을 assets/posts/images 으로 이동시키고, 이동된 정보를 모든 Post를 수정해보도록 한다.
굳이 옮기지 않아도 되지만, 향후 Post 관련 디렉토리를 좀 더 체계적으로 관리하기 위함.
2. Script
2.1 ImageLinkSorter.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/bash
# _posts md 파일 내에 삽입된 이미지 링크 경로를 올바르게 수정해준다.
# 실제 존재하는 이미지인지 여부와 관계없이, assets/posts/images 로 고정해준다.
BASEDIR=$(dirname "$0")
. ${BASEDIR}/env.sh
# 내가 만든 post md 파일
find $HOME/$GIT/*/_posts -type f -name "*.md" |
while read MD
do
# 에서 첨부한 이미지 tag 추출
imgTag=$(grep "\!\[" ${MD})
if [ "x$imgTag" == "x" ]
then
# 이미지 tag가 없는 md파일은 스킵한다.
continue
fi
# 에서 Category 추출 (https://linuxhint.com/sed-capture-group-examples/)
mCat=$(echo ${MD} | sed 's/^\(.*\)\/\(.*\)\/_posts\/\(.*\)\.md$/\2/')
# 에서 이미지 경로만 추출
imgPath=$(echo "${imgTag}" | cut -d'(' -f2 | cut -d')' -f1)
# 이미지가 하나의 MD파일에 여러개가 업로드 되어 있음
echo "${imgPath}" |
while read TAG
do
# 이미지 하나에 대한 정보 (파일명, 확장자, 디렉토리)
iName=$(echo ${TAG} | awk -F'/' '{print $NF}' | cut -d'.' -f1)
iExt=$(echo ${TAG} | awk -F'/' '{print $NF}' | cut -d'.' -f2)
iDir=$(echo ${TAG} | awk -F'/' '{print $((NF-1))}')
# 이미지를 기존 assets/img 가 아닌 새로운 경로로 옮기는 작업 (일회성 실행)
#mkdir -p ${HOME}/${GIT}/assets/posts/images/${iDir}
#mv ${HOME}/${GIT}/assets/img/${iDir}/${iName}.${iExt} ${HOME}/${GIT}/assets/posts/images/${iDir}/${iName}.${iExt}
# post md 파일에서 이미지 path 변경하기 (https://sysopt.tistory.com/79)
sed -i "/${iDir}\/${iName}\.${iExt}/ c\\!\[${iName}\](\/..\/assets\/posts\/images\/${mCat}\/${iDir}\/${iName}\.${iExt})" ${MD}
done
done
2.2 Description
Script의 Part 별로 어떤 역할인지 설명한다.
내가 그동안 작성해온 모든 Post (.md) 파일들만 작업 대상이므로, 선별한다.
1
2
3
# 내가 만든 post md 파일
find $HOME/$GIT/*/_posts -type f -name "*.md" |
while read MD
image markdown (![이름](이미지 파일경로)
) 가 포함된 Post 파일만 찾는다.
1
2
3
4
5
6
7
# 에서 첨부한 이미지 tag 추출
imgTag=$(grep "\!\[" ${MD})
if [ "x$imgTag" == "x" ]
then
# 이미지 tag가 없는 md파일은 스킵한다.
continue
fi
나의 post 게시물들은 07.typora
와 같이 디렉터리를 만들어, 마치 카테고리처럼 관리한다.
구조가 default jekyll blog 와 달라서 필요한 변수이다.
디렉토리 구조중에, 카테고리로 분류되는 지점을 변수화 해준다.
1
2
# 에서 Category 추출 (https://linuxhint.com/sed-capture-group-examples/)
mCat=$(echo ${MD} | sed 's/^\(.*\)\/\(.*\)\/_posts\/\(.*\)\.md$/\2/')
image markdown 에서 (이미지 파일경로)
부분만 추출한다. 이름은 가변적이기 때문에 필요없다.
1
2
# 에서 이미지 경로만 추출
imgPath=$(echo "${imgTag}" | cut -d'(' -f2 | cut -d')' -f1)
1개 Post 파일에도 여러 image markdown 이 존재할 수 있으므로, loop 를 생성한다.
1
2
3
4
# 이미지가 하나의 MD파일에 여러개가 업로드 되어 있음
echo "${imgPath}" |
while read TAG
do
앞에서 구한 실제 image file의 정보를 가지고, 여러 단계로 변수화한다.
1
2
3
4
# 이미지 하나에 대한 정보 (파일명, 확장자, 디렉토리)
iName=$(echo ${TAG} | awk -F'/' '{print $NF}' | cut -d'.' -f1)
iExt=$(echo ${TAG} | awk -F'/' '{print $NF}' | cut -d'.' -f2)
iDir=$(echo ${TAG} | awk -F'/' '{print $((NF-1))}')
이 부분은, 말머리에 언급한 기존 assets/img
에 업데이트 되는 이미지를 앞으로는 assets/posts/images
로 경로 변경을 위해 실행한 코드 조각이다.
직접 윈도우 상에서 디렉토리 복제를 하지 않은 이유는, Post에 사용되고 있지 않은 Garbage file을 한번 여기서 걸러내기 위함이다.
1
2
3
# 이미지를 기존 assets/img 가 아닌 새로운 경로로 옮기는 작업 (일회성 실행)
#mkdir -p ${HOME}/${GIT}/assets/posts/images/${iDir}
#mv ${HOME}/${GIT}/assets/img/${iDir}/${iName}.${iExt} ${HOME}/${GIT}/assets/posts/images/${iDir}/${iName}.${iExt}
sed Pattern 검색 기능을 이용해서, 이미지 파일명으로 변경이 필요한 Line을 수정한다.
1
2
3
4
# post md 파일에서 이미지 path 변경하기 (https://sysopt.tistory.com/79)
sed -i "/${iDir}\/${iName}\.${iExt}/ c\\!\[${iName}\](\/..\/assets\/posts\/images\/${mCat}\/${iDir}\/${iName}\.${iExt})" ${MD}
done
done