2016-03-30 11 views
0

したがって、特定の「テーブル」名のファイルを取得するためにbashコマンドを使用するperlモジュールがあります。私の特定のケースでは、それは "イベント"という名前のテーブルを探していますが、私はこれもすべての名前で動作する必要があります。特定のファイル名をbashから取得する

現在、私はperlスクリプトにMYIファイルをネームテーブルで取得するために次のコードを用意しています。event_*だけでなく、event_extra_data_*も受け取っています。私の例では、event_のデータベースに2番目のテーブルしか存在しません。私のテスト情報として、私は、現在、

$table変数は以下の見ている値であるテーブル「イベント」とevent_extra_dataからテーブルを分割している
event_1459161160_0 
event_1459182760_0 
event_extra_data_1459182745_0 
event_extra_data_1459182760_0 

を持っています。

とにかく私の質問は、これを現在のところevent_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; 
    } 
} 
+0

あなたは[File :: Find](http://perldoc.perl.org/File/Find.html)といっしょにperlでやってみたことがありますか? –

答えて

0

私は、これは、より良い、すべてのperlで行われるだろうと思うけれども、event_*なくevent_extra*を取得する方法についてのあなたの特定の質問に答えるために、あなたはもちろん除外するために、あなたのgrepにそれを追加することができ、またはあなたが使用することができますテーブル名の後に常に_がある場合は、$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; 
+0

ありがとう、私はそれを試みます。 1つの質問ですが、私はperl noobに気付きます。だから、$#ファイルはどういう意味ですか? Iveはこれまでコメントのために#を使用していましたが、シンボリック演算子のGoogle検索ではまあまあでした。 –

+0

配列 '$#'は配列で最後に使用されたインデックスを取得するので、この場合、 '$ files [$#files]'は '@ files'配列の最後のインデックスの値を取得します –

3

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 } 

。 (注 - ディレクトリも含む)。

または使用-Mfile test:ファイルからの修正時刻を読みます

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

(技術的に-Mは日中時代です)。

カスタムソートの場合は、$a$bをスワップするだけで、reverseを削除できます。

関連する問題