fwui.log erro ao executar este script

0

Eu executo este script bash para colocar todos os arquivos com o seguinte formato datado de hoje na mesma pasta. por exemplo aqui eu quero que 2012-12-17_083213 seja minha pasta e dentro dela eu tenho o .log e .log_stats e etc com esse nome dentro dela?

Mas não consigo fazer o script funcionar. Por exemplo, se eu testar tudo até dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
E então para testá-lo, fiz echo $ dir, e isso mostra o seguinte:
fwui.log
Eu procurei e compreendi sobre bloqueios no banco de dados, mas como resolvê-lo?

Este é o script:

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

e estes são os formatos de arquivo:

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  
    
por Jimmy A 03.01.2013 / 16:58

2 respostas

1

primeiro altere a primeira linha do awk com:

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

para que, caso contenham espaços em branco, funcione ainda.

Em seguida, substitua a linha "para eu em" por:

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

e adicione um pouco "" em lugares relevantes:

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

você pode querer tirar a parte "v" no tar, para salvar alguma exibição (uma vez que você sabe que funciona)

outra maneira para o acima:

substitua meu

for i in 20*.log*; do 

com:

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

Ou simplifique o grep:

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

que deve ser suficiente (mas pode corresponder a um arquivo "./-_-1234.log.hahaha" ...)

    
por 03.01.2013 / 18:44
0

Você deve começar com for i in *.log*; do em vez de for i in *.log; do ; caso contrário, você só receberá arquivos que terminem em .log . Além do fato de que pode ser reescrito mais simples, não vejo nenhum outro problema em seu roteiro.

    
por 03.01.2013 / 17:20