【发布时间】:2012-08-04 03:01:20
【问题描述】:
我想要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";
【问题讨论】:
-
当您可以更有效地获取所有信息并且使用
glob和@987654327 没有任何讨厌的极端情况时,您到底为什么要解析像ls的输出那样本质上无法解析的东西@函数? -
为什么不用perl的
glob函数呢?解析ls的输出有时会给你带来麻烦。 (如果您需要文件的元数据,还有stat。)如果您发现自己不得不在 Perl 脚本中使用cut,请阅读split。 -
@JanHudec 他可能需要
-rt部分。glob不会那样做。 -
@Ariel:不会。但是
stat(或-M)内置函数和很少的比较会。 -
或者用更好的话说,你想实际实现什么? 解析供人类消费的文本很少是一个好主意,但如果你提供更多上下文,就有可能是更好的解决方案。