用于将 *.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 是最好的选择。

相关内容