*.log 파일을 새 디렉터리에 복사하는 Bash 스크립트

*.log 파일을 새 디렉터리에 복사하는 Bash 스크립트

다음과 같은 파일이 있습니다.

2012-12-17_083213_1.log  
2012-12-17_083213_1.log_stats  
2012-12-17_083213_1.logaccount_ptr  
2012-12-17_083213_1.loginitial_ptr  
2012-12-17_083213_1.logptr  
2012-12-17_093049_2.log  
2012-12-17_093049_2.log_stats  
2012-12-17_093049_2.logaccount_ptr  
2012-12-17_093049_2.loginitial_ptr  
2012-12-17_093049_2.logptr

여기에서는 데이터 1G마다 Year-Month-Day_HourMinuteSecond_number.log 형식의 이름을 가진 새 파일이 생성됩니다(위 그림 참조).

나는 원해요

  1. 모든 *.log 파일을 "연-월-일" 형식으로 이름이 지정된 새 폴더에 복사합니다. 따라서 파일 이름은 2012-12-17이 됩니다.
  2. tgz그 폴더
  3. 서버 IP로 보냅니다.

정확히 어떻게되는지 모르겠습니다. 새로 추가된 파일에 대해 매일 실행할 수 있도록 bash 스크립트로 사용하고 싶습니다.

답변1

스크립트를 복사해 드릴게요. 하지만 다음에는조사 좀 해봐먼저 직접 작성해 보세요. 이것이 배울 수 있는 유일한 방법입니다. 그리고, 이해하지 못한 채 사용하지 마시기 바랍니다.

#!/bin/bash
tosend=""
for i in *.log; do
    dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
    if [ ! -d $dir ]; then
        mkdir $dir;
    fi;
    cp $i $dir;
    tosend="$tosend\n$dir"
done
for i in $(echo -e $tosend | uniq);do
    echo Compressing $i
    tar -zcvf $i.tar.gz $i
    scp $i.tar.gz user@server
done

중요한 부분은 awk를 사용하여 파일 이름을 분할한 다음 수정된 폴더 목록을 유지하는 것입니다. 가장 우아하지는 않지만 작동합니다.

이러한 파일을 복사하면 다음에 해당 파일을 실행할 때 다시 복사됩니다. 가장 좋은 방법은 그것들을 옮기는 것입니다.

uniq그런데 스크립트를 실행할 때 해당 폴더가 이미 존재할 수 있기 때문에 if 내부의 "배열"에 이름을 추가하는 대신 해당 부분을 추가했습니다 .

그러나 새 파일을 보내고 자정에 실행하려는 경우 아마도 이것이 가장 좋은 방법일 것입니다.

#!/bin/bash
tosend=""
for i in *.log; do
    dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
    if [ ! -d $dir ]; then
        mkdir $dir;
        tosend="$tosend\n$dir"
    fi;
    mv $i $dir;
done
for i in $tosend;do
    echo Compressing $i
    tar -zcvf $i.tar.gz $i
    scp $i.tar.gz user@server
done

이 경우 새 항목만 전송됩니다.폴더(일부 오래된 파일에도 새 파일이 있을 수 있습니다). 그리고 기본 mv폴더는 깨끗하게 유지됩니다.

보다 복잡하고 방탄적인 접근 방식을 위해서는 rsync가 최선의 선택이라고 생각합니다.

관련 정보