运行此脚本时出现 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。除了可以更简单地重写之外,我在您的脚本中看不到任何其他问题。

相关内容