次のファイルがあります。
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形式の名前を持つ新しいファイルが作成されます(上記の図を参照)。
欲しい
- すべての* .logファイルを「年 - 月 - 日」の形式で名前が付けられた新しいフォルダにコピーします。したがって、ファイル名は2012-12-17になります。
tgz
そのフォルダ- サーバー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が最善の選択だと思います。