所以我有一个 perl 模块,它使用 bash 命令来获取具有特定“表”名称的文件。在我的特定情况下,它正在寻找名称为“事件”的表,但我也需要它来处理所有名称。
目前,我的 perl 脚本中有以下代码来获取带有名称表的 MYI 文件,并且我不仅收到 event_*
而且还收到 event_extra_data_*
作为出色地。对于我的示例,我只需要存在于我的数据库中的第二个表用于 event_。作为我的测试信息,我目前有
event_1459161160_0
event_1459182760_0
event_extra_data_1459182745_0
event_extra_data_1459182760_0
它们是表“event”和 event_extra_data 的分区表,event_extra_data 是 $table
变量在下面看到的值。
无论如何,我的问题是,我如何将其限制为仅接收 event_1459182760_0.MYI
而不是 event_extra_data_1459182760_0.MYI
当前正在接收?
elsif ($sql =~ /\{LAST\}/i )
{
$cmd = 'ls -1 /var/lib/mysql/sfsnort/'.$table.'_*MYI | grep -v template | tail -n1 | cut -d"/" -f6 | cut -d"." -f1';
$value = `$cmd`;
print "Search Value: $value\n";
if ($value eq "")
{
$sql = ""; # same as with FIRST
}
else
{
$sql =~ s/\{LAST\}/$value/g;
}
}
最佳答案
不要解析 ls
- 没有意义,而且容易引起问题。
我要指出这一点 - glob
perl 中的函数允许您执行有限数量的“类正则表达式”模式。 (注意 - 它们不是正则表达式,所以不要将它们混淆)。
foreach my $filename ( glob "event_[0-9]*" ) {
#do something with $filename
}
如果您刚好在最后一个之后 - 按数字排序:
my ( $last ) = reverse sort glob "event_[0-9]*";
鉴于您只有一条路径,那么您应该能够:
my ( $last ) = reverse sort glob "/var/lib/mysql/sfsnort/event_[0-9]*.MYI";
请注意 - 这有效,假设您正在使用 time()
数值 - 它正在执行字母数字排序(以及目录名称)。
如果这不是一个有效的假设,您将需要一个自定义排序 - 这很容易,您可以将排序子程序作为排序依据。
或者:
sort { my ($a1) = $a =~ /(\d+)/; my ($b1) = $b =~ /(\d+)/; $b1 <=> $a1 }
从路径中提取第一个“数字串”。 (注意 - 还包括目录)。
或者使用-M
file test :
sort { -M $a <=> -M $b }
将从文件中读取修改时间(技术上 -M
是天数)。
如果您自定义排序,您可以删除 reverse
,只需交换 $a
和 $b
。
关于mysql - 从 bash 获取特定文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36310844/