mysql - 从 bash 获取特定文件名

标签 mysql regex bash perl

所以我有一个 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/

相关文章:

regex - 如何删除特殊字符,空格并在一个字符串中修剪R中的字符变量

php - 在 MySQL DB 上按目标文件夹存储多个上传内容

由空格分隔的多个单词的正则表达式?

php - 使用正则表达式匹配多个变量(PHP/JS)

linux - 如何从顺序输入文件中导出输出文件名?

linux - shell 脚本 - 如何在不在脚本中定义变量的情况下为 shell 脚本使用变量

linux - 如何处理我的 PATH 变量中的重复项?

Mysql:计算没有时间的日期

php - 在 CodeIgniter 中分别将多维数组显示到表行中

mysql - 如何解决mysql程序中的语法错误?