-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 回答
1

如果日志文件的名称在您的控制之下,即没有空格或其他特殊字符,那么可能会做一个快速而肮脏的工作:

my $cmd=' -rw-r--r-- 1 admin u19530 3506 Aug  7 03:34 sla.20120807033424.log more more';
my @items = split ' ', $cmd;
print "log filename is : @items[8..$#items]";
print "\n";
于 2021-11-28T12:19:52.050 回答
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 回答