다음과 같은 파일이 있습니다.
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 형식의 이름을 가진 새 파일이 생성됩니다(위 그림 참조).
나는 원해요
- 모든 *.log 파일을 "연-월-일" 형식으로 이름이 지정된 새 폴더에 복사합니다. 따라서 파일 이름은 2012-12-17이 됩니다.
tgz
그 폴더- 서버 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가 최선의 선택이라고 생각합니다.