【问题标题】:getting specific filename from bash从 bash 获取特定文件名
【发布时间】:2016-07-18 13:48:32
【问题描述】:

所以我有一个 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 的分区表,这是 $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;
    }
}

【问题讨论】:

  • 你有没有考虑过用 perl 做这一切,比如File::Find

标签: mysql regex bash perl


【解决方案1】:

虽然我认为这会更好地全部在 perl 中完成,但要回答您关于如何获得 event_* 而不是 event_extra* 的具体问题,您当然可以将其添加到您的 grep 以过滤掉,或者您可以使用不同的 glob,例如 $table_[0-9]*,如果总是有一个 _,然后在表名后面有一个数字。

在 perl 中你可以这样做:

opendir( DIR, '/var/lib/mysql/sfsnort/' );
my @files = sort grep { /$table_\d/ } readdir( DIR );
closedir( DIR );

$files[$#files] =~ /(^[^.]+)/;
my $value = $1;

【讨论】:

  • 谢谢,我会试试的。不过有一个问题,我是个 perl 菜鸟,那么 $#files 到底是什么意思?到目前为止,我只将 # 用于 cmets,而 google 搜索符号运算符有点糟糕。
  • 使用数组$#<name> 将获取数组中使用的最后一个索引,因此在这种情况下$files[$#files] 将获取@files 数组中最后一个索引处的值
【解决方案2】:

不要解析ls——没有意义,而且容易引起问题。

我要指出这一点——perl 中的glob 函数允许您对有限数量的“类似正则表达式”的模式进行操作。 (注意 - 它们不是正则表达式,所以不要混淆)。

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 }

从路径中提取第一个“数字字符串”。 (注意 - 还包括目录)。

或者使用-Mfile test

sort { -M $a <=> -M $b } 

这将从文件中读取修改时间(技术上-M 是天数)。

如果您自定义排序,您可以删除reverse,只需交换$a$b

【讨论】:

    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2016-03-05
    • 2016-08-03
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多