このスクリプトを実行すると、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*; dofor i in *.log; doそれ以外の場合は、次のファイルが得られます。終わる存在する.log。より簡単に書き直すことができる以外に、スクリプトに他の問題はありません。

関連情報