본문 바로가기

Linux

[Linux] 파일 비교 스크립트 및 파일목록 추출(파일내용 비교, 폴더파일목록 추출)

안녕하세요


이번에 공유할 정보는 " 파일비교 스크립트 " 입니다.


우선 파일목록 추출 먼저 작성 하였습니다.


상황은 외부망, 내부망 각 서버에 파일의 목록을 추출하여


서버 간 동기화가 진행되지 않고 홀로 존재하는 목록을


추리는 것을 목표로 진행 하였습니다


우선 환경은 

  

    - 외부망은 WAS 1


    - 내부망은 WAS 3


    - 폴더경로 /app_data/iros_upload/ 


    - 비교대상 경로, 파일명, 크기, 최종수정시간



으로 가정 하였습니다.



1. 서버의 특정폴더의 파일목록 추출하기(초본 및 최종본)


(초본)

-----------------------------------------------------------------------------------------------------------------------------------

#!/bin/bash


echo ""

echo "     Starting Extraction in WAS1"  

echo ""

echo "     Please Waiting..."

echo ""


###extraction stage

find /app_data/iros_upload/ -exec ls -d -l --time-style="+%Y-%m-%d_%H:%M:%S" {} \; | awk '{print "path:" substr($0,index($0,$7)),"| size:"$5, "| time:"$6}' > Was_1.txt


###sort stage was1

sort -u /app_data/compare_room/Was_1.txt > temp

cat temp > Was_1.txt


###delete temp

rm /app_data/compare_room/temp


echo ""

echo "     Completed Extraction!!!"


-----------------------------------------------------------------------------------------------------------------------------------


echo 부분 : 

스크립트 실행 시 사용자의 편의를 위하여 문구 출력을 추가 하였습니다, 폴더의 용량이 큰 경우 사용자가 스크립트 실행 시 꽤 많은 시간이 소요되므로 혹여나 "뭐야 멈춘거 아냐 ? " 하는 의구심을 줄이기 위함이 목적 입니다


extraction stage 부분 : 

추출을 원하는 폴더를 find 명령어를 이용하여 폴더전체를 검색하여 옵션 추가적으로 ls -d -l 등을 준것을 파일을 비교하기 위해서는 최소한 경로, 크기, 수정시간 등을 비교하여야 하므로 ls -l 명령어를 이용하여 모든 정보를 출력 및 시간을 보기좋게 다시 출력하도록 수정하였습니다, 그런다음 awk를 이용하여 필요한 부부만 자른 후 > 리다이렉션을 이용하여 텍스트 파일을 생성합니다.


sort stage 부분 : 

추출한 파일을 sort 옵션을 이요하여 정렬하여 임시 파일 생성 후 cat으로 읽어 들인 후 다시 > 리다이렉션을 통하여 텍스트 파일로 변환하여 줍니다. 여기서 왜 굳이 ? temp를..? 이유는 저도 알아보고 있는 중입니다만 번거로움을 피하기 위해서 최초 추출한 파일명 즉 Was_1.txt로 바꾸었으나 cat으로 읽어 들이는 과정전에 데이터가 소실되는 문제가 발생하여 아마 파일명 동일로 인한 문제로 temp를 생성하여 살짝 꼬아주니 문제가 해결되었습니다


delete temp 부분 : 

말 그대로 위에서 생성한 임시 temp를 삭제하는 과정 입니다


끝으로 완료 된 후 추출이 완료되었다는 문구를 출력 합니다


아래는 extraction stage 부분을 편집하고 추출하는 과정에서 만들어 참고로 본 명령문이니 참조 하시면 좋을 것 같습니다.


-----------------------------------------------------------------------------------------------------------------------------------


find /app_data/iros_upload/ -exec ls -d -l {} \; | awk '{for (i=5; i<=NF; i++) print $i}' > Was_3.txt 

--5번 필드부터 최종필드까지 출력


find /app_data/iros_upload/ -exec ls -d -l {} \; | awk '{for (i=9; i<=NF; i++) print "path : "$i, "size : "$5}' > Was_1.txt

--path는 for구문으로 9번필드 부터 끝까지 출력, size는 5번필드 출력


find /app_data/compare_room/ -exec ls -d -l {} \; | awk '{print "path : " substr($0,index($0,$9)),"size : "$5}'

--사이즈 및 경로 공백포함 출력


find /app_data/compare_room/ -exec ls -d -l --time-style="+%Y-%m-%d_%H:%M:%S" {} \; | awk '{print "path : " substr($0,index($0,$7)),"size : "$5, "time : "$6}'

--경로(공백포함), 사이즈. 시간(년-월-일_시:분:초)

 

find /app_data/iros_upload/ -exec ls -d -l --time-style="+%Y-%m-%d_%H:%M:%S" {} \; | awk '{print substr($0,index($0,$7))"|"$5"|"$6}' > Was_3.txt

--엑셀에서 .csv파일로 불러들일 때 '|'기호로 구분하여 사용자가 읽기 쉽게 하기 위해서 


-----------------------------------------------------------------------------------------------------------------------------------


위의 명령문들을 편집하고 수정하여 나온 최종본 입니다


(최종본)

-----------------------------------------------------------------------------------------------------------------------------------

extraction.sh


#/bin/bash


echo ""

echo "     Starting Extraction in $ex_result"

echo ""

echo "       -target location : /app_data/iros_upload"

echo ""

echo "     Please Waiting..."

echo ""


###extraction_path

ex_path=`cat extraction.config | grep ex_path | awk -F= '{print $2}'`

ex_file=`cat extraction.config | grep ex_file | awk -F= '{print $2}'`

ex_txt=`cat extraction.config | grep ex_txt | awk -F= '{print $2}'`

ex_result=`cat extraction.config | grep ex_result | awk -F= '{print $2}'`


###extraction stage

find $ex_path -exec ls -d -l --time-style="+%Y-%m-%d_%H:%M:%S" {} \; | awk '{print "path:" substr($0,index($0,$7)),"| size:"$5, "| time:"$6}' > $ex_txt


find $ex_path -exec ls -d -l --time-style="+%Y-%m-%d_%H:%M:%S" {} \; | awk '{print substr($0,index($0,$7))"|"$5"|"$6}' > $ex_txt

###sort stage was

sort -u $ex_txt > temp

cat temp > ${ex_result}_$(date '+%Y%m%d%H%M%S').txt


###delete temp

rm $ex_file/$ex_txt $ex_file/temp


echo ""

echo "     Extraction on Completed!!!"

echo ""


-----------------------------------------------------------------------------------------------------------------------------------

extraction.config


###This is extraction.config###


ex_path=/app_data/iros_upload

ex_file=/app_data/compare_room

ex_txt=Was1.txt

ex_result=Was1


-----------------------------------------------------------------------------------------------------------------------------------


작성하다 보니 욕심이 생겨서 .config 파일(이하 컨피그 파일)까지 생성했습니다.


extraction_path 부분 :

ex_path=`cat extraction.config | grep ex_path | awk -F= '{print $2}'` 이렇게 간 이유는 스크립트 부분은 그대로 두고 경로만 변경하여 어디에서는 이식성이 좋도록 하기 위해서 바꿨습니다.


extraction stage 부분 :
$(date '+%Y%m%d%H%M%S') 파일이 한두개 생성 되는게 아니기 때문에 파일생성시 시간을 입력하면서 생성시키기 위하여 입력한 구문 입니다

이해안되시는 부분을 댓글을 달아 주세요~


'Linux' 카테고리의 다른 글

[Linux] httpd.conf 옵션 설정 한글설명  (0) 2019.09.23
[Linux] OpenSSL 업데이트 Update 0.9.8e - 1.0.1e  (0) 2019.09.19
[Linux] CentOS 5 yum error  (0) 2019.09.18
[Linux] APM 소스 설치  (0) 2019.02.19
[etc] POP3 vs IMAP 차이  (0) 2019.01.14