我想从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";
通过使用-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.
如果你愿意选择其他的选择,你可以做到这一点,这是不可能的。
顺便说一句,即使没有-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]'