-
리눅스 Shell2 - file merge, splitInfra 2021. 5. 15. 19:30
파일처리가 밀려 대량의 파일을 처리해야는경우 작업속도를 위해 파일들을 병합(merge), 분할(split) 해야하는 일이 생겼습니다. 이를 위한 쉘을 만들어봤습니다.
작업순서
- 대상파일 목록 저장 -> 배열
- 파악한 대상은 임시폴더로 이관
- 원본파일들을 작업경로 복사
- 원본파일 데이터들을 하나의 파일로 병합
- 데이터 건수비교, 맞으면 복사해온 원본파일 삭제 (용량 정리)
- 병합한 파일을 레코드 수 기준으로 분할
- 처리가능한 파일명으로 변환
- 파일의 정상생성을 알리는
.FIN
파일 생성
- 파일의 정상생성을 알리는
- 최종 경로로 복사
경로
- src1 : 변환된 파일 저장경로 (대상파일목록 수집경로)
- src2 : 원본파일 보관경로
- mns : 파일병합 및 분할 작업 경로
- tgt : 결과파일 저장 경로
Shell Script 작성
필요한 기능과 작업순서를 고려해서 작성했지만 개선해야할 부분들이 많습니다. 예를들면 분할이 정상적으로 이뤄졌는지 데이터 비교가 필요하고 그 외 예외적인 경우를 방지하는 부분들을 추가해야합니다. 또한 반복적으로 사용하는 값들도 하나의 변수에 등록하고 사용하는 등 많은데 차차 개선해보려고 합니다.
쉘파일 생성
vi test.sh chmod +rx test.sh #실행 (파라미터로 병합할 파일 일자 입력) ./test.sh yyyymmdd
초기 설정값 등록
#!/bin/bash dir_src1='/home/admin/src1/' dir_src2='/home/admin/src2/' dir_mns='/home/admin/mns/' dir_tgt='/home/admin/tgt/' date=$1
대상파일 수집 (파일목록 수집 및 대상 복사)
#colec file_list cd $dir_src1 file_list=`ls *${date}*.DAT | sort` for item in ${file_list[@]} do echo $item echo ${item:4:8} done #copy origin files cd $dir_src2 for item in ${file_list[@]} do #일자별 파일분리 if [ ! -d ./$date ] then mkdir ./$date fi #일자별 파일 분리 if [ ! -d ${dir_mns}${date} ] then mkdir ${dir_mns}${date} fi cp $item ${dir_mns}${date} mv $item ${dir_src2}${date} done
파일병합
.MRG
라는 하나의 파일로 파일병합- 원본파일 데이터 건수와 병합파일 데이터 건수 확인 (맞으면 복사해온 원본파일 삭제 - 불필요)
#file merge cd ${dir_mns}${date} ls *${date}*.DAT | sort | xargs cat > D1_T${date}.MRG orgin_rec_cnt=`cat *${date}*.DAT |wc -l` mrg_rec_cnt=`cat *${date}*.MRG |wc -l` if [ $orgin_rec_cnt -ne $mrg_rec_cnt ] then echo 'file_merge error' exit 1; else rm -rf *${date}*.DAT fi
파일분할 및 FIN파일생성
- 파일처리과정에서
.FIN
확장자 파일이 존재할 경우.DAT
파일을 처리하는 구조 - 그래서
.FIN
파일을 생성
#file split split -d -a 4 -l 3 D1_T${date}.MRG ../D1_T${date}.DAT_ #rename DAT file & touch FIN cd ${dir_mns} file_list=`ls D1_*${date}*.DAT_* | sort` for item in ${file_list[@]} do idx=${item:17:4} time=`date +'%H%M%S'` echo ${idx} echo ${time} mv ${item} D1_${idx}_T${date}${time}.DAT touch D1_${idx}_T${date}${time}.FIN done
분할된 파일 타겟경로로 이관
#send files to tgt_dir mv D1_*_T${date}*.DAT ${dir_tgt} mv D1_*_T${date}*.FIN ${dir_tgt} echo done
'Infra' 카테고리의 다른 글
리눅스 서버 배포환경 구축하기 4 - Jenkins설치 및 git연동 (0) 2021.05.19 리눅스 서버 배포환경 구축하기 3 - 톰캣 설치 및 아파치 연동 (1) 2021.05.18 리눅스 서버 배포환경 구축하기 2 - 아파치 설치 (0) 2021.05.17 리눅스 서버 배포환경 구축하기 1 - CentOS7 설치 (0) 2021.05.16 간단한 Log Backup Shell 만들기 (0) 2021.05.14 - 대상파일 목록 저장 -> 배열