bash shell을 이용해 폴더 내 파일 한번에 이동하기(feat.자동화)

자동화

자동화라는 말을 많이 들어왔을 겁니다.
생산성을 위해선 필수적인 요소입니다.
우리는 자동화에 항상 신경써야 시간을 효율적으로 사용하여 몸값을 올릴 수 있습니다.
여러분의 시간이 곧 돈이기 때문이죠.

자동화를 다루는 내용만 빠르게 확인하고 싶으시면 하단의 bash shell script 부분 부터 읽으시면 됩니다.

문제점 파악

지난 포스트를 오랜만에 작성하다 보니 블로그를 쓰는데 개인적으로 불편한 점이 인지되었습니다.
다른 플랫폼과 달리 hexo 기반의 github io 를 이용한 블로그를 사용하면서 생긴 문제였는데요.

먼저 간단히 hexo를 이용한 github io 블로그를 사용하면서 생긴 불편함을 공유하겠습니다.

  1. 폴더 관리를 이원화 해야한다.
    • 새 글을 작성하기 위한 hexo 활용을 위한 폴더 -> private으로 관리하고 싶음
    • githubid.github.io -> 필수로 공개로 해야함
  2. hexo에서 제공하는 deploy 기능은 github으로 바로 force push를 해서 관리하기가 불편함

참고로 제가 deploy 하는 순서를 알려드리자면

1
2
3
4
hexo new post "제목" // -> 새로 글 쓸 파일 생성 -> 파일 내용 작성
hexo generate // _post에 작성된 파일을 긁어서 html파일로 변환해줌
hexo server // localhost에서 확인 가능
hexo deploy

저는 대안책으로 필수공개가 되어야 하는 githubid.github.io의 폴더를 직접 관리하면서 직접 푸쉬하는 방법을 생각했습니다.
가장 큰 이유는 readme가 매번 날아가기때문이었는데요.(이거 자동으로 세팅하는 방법이 있다면 알려주세요)
deploy 로 자동으로 push 할때 해당 파일이 생성이 안돼 덮어쓰면서 남기고 싶은 폴더 혹은 파일이 매번 사라진다는 단점이 있었습니다.
또 공개하고 싶지 않은 폴더 및 파일이 그대로 올라가는 문제가 있었습니다. .gitignore관리도 되지 않기 때문이죠.

이 문제를 해결하기 위해 전 포스트될 내용에 필요한 파일만 공개된 repo에 복사를 해서 관리를 하기로 마음 먹었고, 필요한 내용을 일일이 복사해서 넘겨주어야 하는 문제가 생겼습니다.

최소 4~5번의 복사 과정을 거쳐야 하는데 포스팅하는 주제가 늘어나면 폴더도 같이 늘어나 더 많은 작업을 해야했죠.글 쓴 뒤 생각해보니까 그냥 finder에서 마우스로 복사해도 되는거였어..

bash shell script

이쯤에서 이걸 shell script를 이용해 자동화하면 좋겠다는 생각을 합니다.

shell script를 간단히 소개해드리자면 결국 어떤 동작을 하는 작은 프로그램을 위한 파일을 미리 생성해 두는 겁니다.
스크립트를 작성해두고 필요한 순간에 해당 스크립트를 실행해 원하는 동작을 컴퓨터가 알아서 수행하도록 하는 것이죠.

bash shell script는 기본적으로 확장자로 sh를 사용합니다.
그리고 첫 줄엔
#!/bin/bash
가 들어갑니다(bash 의 위치)

기본적으로 프로그래밍을 조금 해봤다면 검색 몇번으로 활용법을 찾아보실 수 있을 거에요.

전 제가 필요한 부분만 빠르게 습득해서 아래와 같이 테스트 해봤습니다.

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
lists=$(ls public)
for item in ${lists}
do
if [ $item != "copy.sh" ]
then
cp ./public/$item ../end/
echo "done : " $item
fi
done

위 코드를 해석해보자면
첫줄은 shell script 를 실행하기 위해 필수로 들어가는 부분이고,
둘째줄은 명령어 ls의 결과(현 위치 하위의 public이라는 폴더에 있는 폴더 및 파일 목록을 나열)를 lists라는 변수에 담아두는 작업입니다.

그 뒤로는 우리가 흔히 접하는 for문입니다.
for 뒤에 흔히 사용하는 {} 대신 dodone으로 원하는 내용을 감싸고 있다고 생각하시면 됩니다.
if문엔 thenfi 를 사용합니다.

간단히 해석해드리자면,
lists에 담은 결과들 중 이 파일의 이름인 copy.sh이라는 이름을 제외 시켜 루프를 돌립니다.
그 모든 파일을 임시로 지정해 놓은 현재 속한 폴더와 동일한 depth에 있는 end라는 폴더에 cp명령어를 이용해 복사시킵니다.

제가 원하는 동작이 제대로 됐는지 눈으로 바로 확인하기 위해 echo를 이용해 done :뒤에 어떤 파일인지 하나하나 출력해줍니다.

실행은 ./copy.sh 명령어를 사용합니다.
만약에 실행권한이 없다면

1
chmod +x copy.sh

를 이용해 실행권한을 줍니다.sudo를 써도 될 듯 하네요

1
2
3
4
5
6
7
8
9
10
11
done :  Diary
done : IT
done : archives
done : categories
done : content.json
done : css
done : index.html
done : js
done : page
done : resume
done : tags

위가 출력된 결과 입니다.
제가 포스팅 하고 있는 폴더들과 그 외 필요한 파일들이 잘 처리되었다고 출력되었습니다.
해당 폴더에서 확인해보는 것도 잊지 않아야겠죠?

제 작업이 실제 원하는 곳으로 잘 전달된건 여러분도 확인하실 수 있어요.
바로 이 포스트가 그 방법으로 올라왔기 때문이죠.

읽어 주셔서 고맙습니다.
다음에 또 다른 팁으로 돌아올게요 :)

Share 0 Comments