✨ 원래 내 업무의 주요 일정 중 하나는 데이터 업데이트에 있다. 이것이 자동화가 되어있는 것이 아니라, 한 3분의 1은 수동이라고 봐도 무방하다. 그중에서 나는 특정 사이트에서 파일을 다운로드받고, 그것을 aws s3 버킷에 업로드를 해야 하는 일이 있는데, 이것의 경우 내가 다운 받은 후 특정 양식에 맞게 이름 변경 후에 재업로드를 해야 한다. 특히 윈도우 환경과 다르게 맥의 경우는 동시에 압축이 안 되기 때문에 이전에는 하나하나 직접 업로드를 했어야 했다. 이것을 간략화하여 쉘 스크립트로 한번에 하는 방법을 생각했고, 이것을 만드는 과정을 기록해보고자 한다.
🪡 기본 구조 설정
먼저 작업에 필요한 기본 디렉토리와 변수들을 설정한다.
#!/bin/bash
# 작업 디렉토리 설정
WORK_DIR="example_list"
TEMP_DIR="temp_extract"
# S3 버킷 정보
S3_BUCKET="s3://your-bucket-name/example"
# 임시 디렉토리 생성
mkdir -p "$TEMP_DIR"
- `WORK_DIR`: 원본 압축 파일들이 있는 디렉토리
- `TEMP_DIR`: 압축 해제를 위한 임시 디렉토리
- `S3_BUCKET`: 업로드할 S3 버킷 경로
🔗 파일 처리 로직
압축 파일을 처리하는 주요 로직이다. 이 부분은 두 가지 케이스를 처리한다:
1. 압축 파일을 풀었을 때 직접 AL_ 파일이 있는 경우
2. 폴더 안에 AL_ 파일이 있는 경우
# 첫 번째 수준의 내용물 확인
first_al_file=$(find "$TEMP_DIR" -maxdepth 1 -name "AL_*.zip" | head -n 1)
if [ -n "$first_al_file" ]; then
# AL_ 파일이 직접 있는 케이스
base_name=$(basename "$first_al_file")
region_code=${base_name:3:2}
date_str=${base_name##*_}
date_str=${date_str%.zip}
DATE_STR=$date_str
new_folder_name="example_${region_code}_${date_str}"
cd "$TEMP_DIR" || exit
zip -q -r "../$WORK_DIR/$new_folder_name.zip" ./*
cd - || exit
이 코드는...
- find 명령어로 AL_로 시작하는 zip 파일을 찾는다.
- 파일 이름에서 지역 코드와 날짜를 추출한다.
- 새로운 이름 형식(example_XX_YYYYMM)으로 재압축한다.
📌 폴더 구조 처리
폴더 안에 압축 파일이 있는 경우의 처리 로직이다.
else
# 폴더 안에 AL_ 파일들이 있는 케이스
folder_path=$(find "$TEMP_DIR" -mindepth 1 -maxdepth 1 -type d | head -n 1)
if [ -n "$folder_path" ]; then
first_al_file=$(find "$folder_path" -maxdepth 1 -name "AL_*.zip" | head -n 1)
if [ -n "$first_al_file" ]; then
base_name=$(basename "$first_al_file")
region_code=${base_name:3:2}
date_str=${base_name##*_}
date_str=${date_str%.zip}
new_folder_name="example_${region_code}_${date_str}"
cd "$folder_path" || exit
zip -q -r "../../$WORK_DIR/$new_folder_name.zip" ./*
cd - || exit
fi
fi
fi
이 코드는..
- 폴더 구조를 유지하면서 압축 파일을 처리.
- 원본 구조를 보존하면서 최상위 폴더 이름만 변경.
📏 S3 업로드
마지막으로 처리된 파일들을 S3에 업로드한다.
# S3에 업로드
if [ -n "$DATE_STR" ]; then
echo "S3 업로드 시작: $S3_BUCKET/$DATE_STR/"
aws s3 cp "$WORK_DIR/" "$S3_BUCKET/$DATE_STR/" --recursive --exclude "*" --include "example_*.zip"
# 업로드 성공 여부 확인
if [ $? -eq 0 ]; then
echo "S3 업로드 완료"
else
echo "S3 업로드 실패"
exit 1
fi
fi
이 코드는...
- 처리된 파일들을 년월 폴더(YYYYMM)에 업로드.
- example_로 시작하는 zip 파일만 선택적으로 업로드.
- 업로드 성공 여부를 확인하고 결과를 알려준다.
🔖사용 방법
1. 스크립트 파일을 생성하고 실행 권한을 부여한다:
chmod +x rename_and_upload.sh
2. AWS CLI가 설정되어 있는지 확인한다:
aws configure
3. 스크립트를 실행한다:
./rename_and_upload.sh
이렇게 하면 수동으로 하나하나 처리해야 했던 작업을 한 번의 명령어로 처리할 수 있다. 특히 맥 환경에서 압축 파일 처리가 번거로웠던 부분을 자동화하여 업무 효율을 크게 높일 수 있었다. 이제 남은 일은, 이렇게 업로드가 완료된 이후는 스크립트로 자동으로 다시 분류를 하고, 배치를 위한 형태로 원본 데이터를 가공하는 스크립트를 사용하는 것인데, 이것을 연결하는 일이다. 두가지를 연결해서 한번에 한다면 작업에 대한 비용이 훨씬 효율적으로 변할 것이라고 생각한다 :)!!