我想要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";
答案 0 :(得分: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.
答案 1 :(得分:2)
使用-l
让自己变得更难。这将做你想要的
print((`ls -brt`)[0]);
但是除非Perl不能提供你需要的东西,否则通常最好避免炮轰,这可以轻松完成
print "$_\n" for (sort { -M $a <=> -M $b } glob "*")[0];
答案 2 :(得分:0)
使用-lrt
无法可靠地执行此操作 - 如果您愿意选择其他选项,则可以执行此操作。
顺便说一句,即使没有-rt
,您仍然可以使用-l
按相反时间排序。
此外,如果您必须使用ls,则应该使用-b
。
答案 3 :(得分: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 ;
免责声明 - 如果filename有空格且可能在其他情况下,则无效。 OP将知道相关文件的命名约定。我同意有更强大的方式不使用ls -lrt
。
答案 4 :(得分:-1)
也许就是这样:
ls -lrt *.log | perl -lane 'print $F[-1]'