我有以下文件。我每隔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);
}
答案 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
请注意,如果新文件的名称包含字母x
和y
,如问题和评论中所示,则会在包含时间戳作为数字的名称后面列出,因此它将会被拿起作为新文件。它还假定允许在/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通常比尝试解析ls
或find
输出更好。在此上下文中,文件名在名称中具有一组受限制的字符(没有换行符,没有空格或制表符,没有引号,没有美元符号等),使用find
或{{ls
1}} - 但如果你必须处理随机最终用户创建的任意名称,那些工具就不适合了。 (ls
命令会使用奇怪的名称执行各种奇怪的操作,并且在用户讨论时基本上难以可靠地使用。find
命令及其-print0
选项可以使用,特别是如果你有sort
认可-z
使用空终止&#39;行&#39;以及xargs
支持-0
来处理此类行 - 但你必须非常小心。)
请注意,此方案不会记录上次分析的文件(因此,如果一小时内没有新文件出现,您可能会发送相同差异的十几个副本),也不会直接报告文件名(但是使用diff -u
或diff -c
将包括在输出中扩散的文件名)。同样,如果这些问题适当(可能是),这些问题可以解决。记录哪些文件已被比较可能是最难的工作;即便这样也不错:
echo "$old" "$new" >> reported.diffs
记录已处理的内容;然后
if grep -q "$old $new" reported.diffs
then : Already processed
else : Process $old and $new
fi