如何从Perl的ls -lrt输出中查找/剪切文件名

我想从ls -lrt的输出文件名,但我无法find一个文件名。 我使用下面的命令,但它不起作用。

 $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"; 

Solutions Collecting From Web of "如何从Perl的ls -lrt输出中查找/剪切文件名"

通过使用-l你正在使自己变得更加困难。 这将做你想要的

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

但是,除非Perl不能提供你所需要的东西,否则通常最好避免脱壳,这可以很容易地完成

 print "$_\n" for (sort { -M $a <=> -M $b } glob "*")[0]; 
 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. 
  • 文件::查找::规则
  • 文件::统计
  • 列表::的Util

如果你愿意选择其他的选择,你可以做到这一点,这是不可能的。

顺便说一句,即使没有-l你仍然可以用-rt排序。

另外如果你必须使用ls,你应该使用-b

 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

也许是这样的:

 ls -lrt *.log | perl -lane 'print $F[-1]'