-1

の出力からファイル名を取得したいのですが、ファイル名ls -lrtが見つかりません。以下のコマンドを使用しましたが、機能しません。

$cmd=' -rw-r--r-- 1 admin u19530 3506 Aug  7 03:34 sla.20120807033424.log';
my $result=`cut -d, -f9 $cmd`;
print "The file name is $result\n";

結果は空白です。ファイル名が必要ですsla.20120807033424.log


これまでのところ、以下のコードを試してみましたが、ファイル名に対して機能します。

コード

#!/usr/bin/perl
my $dir = <dir path>;
opendir (my $DH, $dir) or die "Error opening $dir: $!";
my %files = map { $_ => (stat("$dir/$_"))[9] } grep(! /^\.\.?$/, readdir($DH));
closedir($DH);
my @sorted_files = sort { $files{$b} <=> $files{$a} } (keys %files);
print "the file is $sorted_files[0] \n";
4

6 に答える 6

8
use File::Find::Rule qw( );
use File::stat       qw( stat );
use List::Util       qw( reduce );

my ($oldest) =
   map $_ ? $_->[0] : undef,                              # 4. Get rid of stat data.
   reduce { $a->[1]->mtime < $b->[1]->mtime ? $a : $b }   # 3. Find one with oldest mtime.
   map [ $_, scalar(stat($_)) ],                          # 2. stat each file.
   File::Find::Rule                                       # 1. Find relevant files.
      ->maxdepth(1)                                       #       Don't recurse.
      ->file                                              #       Just plain files.
      ->in('.');                                          #       In whatever dir.
于 2012-08-07T06:44:23.947 に答える
2

を使用することで、自分自身が難しくなっています-l。これはあなたが望むことをします

print((`ls -brt`)[0]);

しかし、一般的には、必要なものを Perl が提供できない場合を除いて、無駄遣いを避ける方がよいでしょう。これは簡単に行うことができます。

print "$_\n" for (sort { -M $a <=> -M $b } glob "*")[0];
于 2012-08-07T10:28:46.813 に答える
0

でそれを確実に行うことは不可能-lrtです-あなたが他のオプションを選択することをいとわないのであれば、あなたはそれを行うことができます。

-rtところで、。がなくても、逆の時間で並べ替えることができます-l

また、lsを使用する必要がある場合は、おそらく。を使用する必要があります-b

于 2012-08-07T06:13:05.810 に答える
0
my $cmd = ' -rw-r--r-- 1 admin u19530 3506 Aug  7 03:34 sla.20120807033424.log';

$cmd =~ / ( \S+) $/x or die "can't find filename in string " ;
my $filename = $1 ;

print $filename ; 

免責事項 - ファイル名にスペースが含まれている場合、およびおそらく他の状況では、これは機能しません。OP は、関連するファイルの命名規則を認識します。を使用しないより堅牢な方法があることに同意しls -lrtます。

于 2012-08-07T08:27:06.417 に答える
-1

多分このように:

ls -lrt *.log | perl -lane 'print $F[-1]'
于 2012-08-07T07:58:16.947 に答える