*.log ファイルを新しいディレクトリにコピーする Bash スクリプト

*.log ファイルを新しいディレクトリにコピーする Bash スクリプト

次のファイルがあります。

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形式の名前を持つ新しいファイルが作成されます(上記の図を参照)。

欲しい

  1. すべての* .logファイルを「年 - 月 - 日」の形式で名前が付けられた新しいフォルダにコピーします。したがって、ファイル名は2012-12-17になります。
  2. tgzそのフォルダ
  3. サーバー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が最善の選択だと思います。

おすすめ記事