1

这是我的问题:

我有一个 perl 脚本,可以为我搜索一些 Linux 文件。文件名是这样的:

shswitch_751471_126.108.216.254_13121

问题是

13121

是一个随机增加的id。我正在尝试,从今天早上开始搜索正确的正则表达式,但我找不到它!请问,你能帮忙吗?

这是我所拥有的:

#!/usr/bin/perl 
$dir = "/opt/exploit/dev/florian/scan-allied/working-dir/";
$adresse ="751471" ; 
$ip =  "126.108.216.254";
$tab=`find $dir -type f -name \"$dir_$adresse_$ip_*\"`; 
print $tab;

我什至试过

    $tab=`find $dir -type f -name \"$dir_$adresse_$ip_[0-9]{1}\"`;

但是 perl 不会听我的 :(

4

3 回答 3

2

问题是您已包含$dir在传递给find.

你或许想说:

$tab=`find $dir -type f -name \"shswitch_${adresse}_${ip}_*\"`; 
于 2013-07-09T12:40:43.920 回答
2

改变这一行:

$tab=`find $dir -type f -name \"$dir_$adresse_$ip_*\"`; 

$tab=`find $dir -type f -name \"${dir}_${adresse}_${ip}_*\"`; 
于 2013-07-09T12:42:53.317 回答
1

呃。如果你使用那么你真的不需要打电话find(1)!如果您使用File::Findfind模块,那么您可以在没有外部调用的情况下获得更好的结果。尝试这样的事情:

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my $dir = "/opt/exploit/dev/florian/scan-allied/working-dir/";
my $addresse ="751471" ; 
my $ip =  "126.108.216.254";
my $re = "shswitch_${addresse}_${ip}_\d+";

sub wanted {
    /^$re$/ and -f $_ and print "$_\n";
}

find \&wanted, $dir;

这将打印所有匹配的文件。

您可以使用find2perl实用程序将完整的find命令行转换为wanted函数!

为了

find2perl /opt/exploit/dev/florian/scan-allied/working-dir -type f -name \"shswitch_751471_126.108.216.254_${ip}_*\"

提供以下代码:

#! /usr/bin/perl -w
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
        if 0; #$running_under_some_shell

use strict;
use File::Find ();

# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.

# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;



# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/opt/exploit/dev/florian/scan-allied/working-dir');
exit;


sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -f _ &&
    /^"shswitch_751471_126\.108\.216\.254__.*"\z/s
    && print("$name\n");
}
于 2013-07-09T14:19:39.173 回答