이 스크립트를 실행할 때 fwui.log 오류가 발생했습니다.

이 스크립트를 실행할 때 fwui.log 오류가 발생했습니다.

나는 이 bash 스크립트를 실행하여 오늘 다음 형식의 모든 파일을 동일한 폴더에 넣습니다. 예를 들어, 여기 2012-12-17_083213내 폴더가 되고 싶은데 그 안에는 .log.log_stats이름이 들어 있습니다.

하지만 스크립트가 작동하도록 할 수는 없습니다. 예를 들어, 그때까지 모든 것을 시도하면 dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
테스트하기 위해 echo $dir 을 수행하고 다음과 같이 표시됩니다.
fwui.log
데이터베이스의 잠금에 대해 검색하고 이해했는데 어떻게 해결합니까?

스크립트는 다음과 같습니다.

#!/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  

파일 형식은 다음과 같습니다.

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  

답변1

먼저 awk의 첫 번째 줄을 다음과 같이 변경합니다.

dir="$(echo "$i" | awk '{split($0,a,"_"); printf "%s_%s",a[1],a[2]}')"

이렇게 하면 공백이 포함되어 있어도 계속 작동합니다.

그런 다음 "for i in" 줄을 다음으로 바꿉니다.

echo -e "$tosend" | grep -v '^$' | sort | uniq | while IFS= read i ;do

그리고 관련 장소에 ""를 추가하세요.

#!/bin/bash  
tosend=""  
for i in 20*.log*; do     
    dir="$(echo "$i" | awk '{split($1,a,"_"); printf "%s_%s",a[1],a[2]}')";  
    if [ ! -d "$dir" ]; then  
        mkdir "$dir" || { echo "ERROR during: mkdir '$dir'" ; exit 1 ; };  
    fi;  
    cp "$i" "$dir" || { echo "ERROR during: cp '$i' '$dir'" ; exit 2 ; };  
    tosend="${tosend}\n${dir}"  
done  
echo -e "$tosend" | grep -v '^$' | sort | uniq| while IFS= read i ;do  
    echo "Compressing $i"  
    echo REMOVE THIS ECHO ONCE TESTED tar -zcvf "${i}.tar.gz" "$i" \
    && { echo REMOVE THIS ECHO ONCE TESTED scp "${i}.tar.gz" user@server:/tmp/somedir/ \
         || { echo "ERROR during: scp '${i}.tar.gz' user@server:/tmp/somedir/" ; exit 4 ; };
       }
    || { echo "ERROR during: tar -zcvf '${i}.tar.gz' '$i'" ; exit 3 ; }; 
done  

일부 디스플레이를 저장하려면 tar에서 "v" 부분을 제거해야 할 수도 있습니다(작동한다는 것을 알고 나면).

위의 작업을 수행하는 또 다른 방법:

내 것을 교체하다

for i in 20*.log*; do 

그리고:

ls -1d *|grep '^[0-9]*-[0-9]*-[0-9]*_[0-9]*_[0-9]*\.log.*'| while IFS= read i ; do

또는 grep을 단순화합니다.

ls -1d *|grep '^[0-9_-]*\.log' | while IFS= read i ; do

이 정도면 충분합니다(그러나 "./-_-1234.log.hahaha" 파일과 일치할 수 있습니다...).

답변2

로 시작해야 합니다 for i in *.log*; do. for i in *.log; do그렇지 않으면 다음과 같은 파일을 얻게 됩니다.마치다존재하다 .log. 더 간단하게 다시 작성할 수 있다는 것 외에는 스크립트에 다른 문제가 없습니다.

관련 정보