将diff用于两个文件并通过电子邮件发送

时间:2015-11-22 19:06:07

标签: linux bash shell unix awk

我有以下文件。我每隔5分钟使用crontab来检查文件,看看系统是否添加了一个文件,例如:diff。然后我需要在最后一个和最后一个之间自动使用AIR_20151021T163514000.cfg AIR_20151026T103845000.cfg AIR_2015xxxxT0yyyyyyyy.cfg 命令。

#!/bin/bash
/var/opt/fds/
diff AIR_2015xxxxT0yyyyyyyy.cfg AIR_20151026T103845000.cfg > Test.txt

body(){
cat body.txt
}
(echo -e "$(body)") | -a Test.txt mailx -s 'Comparison' user@email.com

我想在下面的脚本中执行此操作:

private Matrix GridToMatrix(DataGridView grid)
{
    var matrix = new double[grid.RowCount, grid.ColumnCount];

    for (int i = 0; i < grid.RowCount; i++)
    {
        for (int j = 0; j < grid.ColumnCount; j++)
        {
            matrix[i, j] = Convert.ToSingle(grid[i, j].Value);
        }
    }

    return new Matrix(matrix);
}

1 个答案:

答案 0 :(得分:2)

给出目录/var/opt/fds中的文件列表,其名称格式为:

AIR_YYYYmmddTHHMMSSfff.cfg

其中字母Y代表年份的数字,m代表月份,d代表日,H代表小时,M代表分钟,S代表秒,f代表分数(毫秒),那么你需要确定最近的两个目录中的文件来比较它们。

一种方法是:

cd /var/opt/fds || exit 1

old=
new=
for file in AIR_20[0-9][0-9]????T?????????.cfg
do
    old=$new
    new=$file
done

if [ -n "$old" ] && [ -n "$new" ]
then
    diff "$old" "$new" > test.txt
    mailx -a test.txt -s 'Comparison' user@example.com < body.txt
fi

请注意,如果新文件的名称包含字母xy,如问题和评论中所示,则会在包含时间戳作为数字的名称后面列出,因此它将会被拿起作为新文件。它还假定允许在/var/opt/fds目录中写入,并且邮件正文文件也存在于该目录中。如有必要,可以简单地修正这些假设。 test.txt文件也应该在发送后删除,并且您可以在发送电子邮件之前检查它是否为空(以防两个最新文件实际上是相同的)。您可以在包含差异的生成文件名中嵌入时间戳,而不是使用test.txt

output="diff.$(date +'%Y%m%dT%H%M%S000').txt"

然后使用$output代替test.txt

测试确保既有旧名称又有新名称。模式匹配比它可能更糟糕,但使用[0-9]或适当的子范围([01][0-3][0-2][0-5])来表示问号使模式长得不可思议:

for file in AIR_20[0-9][0-9][01][0-9][0-3][0-9]T[0-2][0-9][0-5][0-9][0-5][0-9][0-9][0-9][0-9].cfg

它也可能在保护方面提供很少的额外费用。当然,如图所示,它会对系统造成Y2.1K危机,而不是很难解决这个问题。你也可以根据今天的日期减少有效日期的范围,但要注意今年年底等等。你可能会认为你只需要上个月左右的条目。

使用globbing通常比尝试解析lsfind输出更好。在此上下文中,文件名在名称中具有一组受限制的字符(没有换行符,没有空格或制表符,没有引号,没有美元符号等),使用find或{{ls 1}} - 但如果你必须处理随机最终用户创建的任意名称,那些工具就不适合了。 (ls命令会使用奇怪的名称执行各种奇怪的操作,并且在用户讨论时基本上难以可靠地使用。find命令及其-print0选项可以使用,特别是如果你有sort认可-z使用空终止&#39;行&#39;以及xargs支持-0来处理此类行 - 但你必须非常小心。)

请注意,此方案不会记录上次分析的文件(因此,如果一小时内没有新文件出现,您可能会发送相同差异的十几个副本),也不会直接报告文件名(但是使用diff -udiff -c将包括在输出中扩散的文件名)。同样,如果这些问题适当(可能是),这些问题可以解决。记录哪些文件已被比较可能是最难的工作;即便这样也不错:

echo "$old" "$new" >> reported.diffs

记录已处理的内容;然后

if grep -q "$old $new" reported.diffs
then : Already processed
else : Process $old and $new
fi