Nic*_*aña 3 bash perl file directory-listing
我在基于HP-UX的计算机上工作,我需要按日期列出文件夹中包含的日志名称,并将名称分隔为";" 和结果,按日期降序排序,存储在txt中,因此txt的内容如下:
2019-02-02;/home/user/Documents/imthelog03.log
2019-02-01;/home/user/Documents/imthelog02.log
2019-01-29;/home/user/Documents/imthelog01.log
Run Code Online (Sandbox Code Playgroud)
我试过这个:
find /home/user/Documents/*.log* exec perl -MPOSIX -e 'print POSIX::strftime "%Y%m%d\n", localtime((stat $ARGV[0])[9])'
Run Code Online (Sandbox Code Playgroud)
但是我无法得到我需要的东西,我不能使用stats
我使用a for
逐行读取所以我如何得到日期并用txt中的a path/filename
分隔;
,按日期降序使用bash并最终perl , 谢谢!
可以在Perl中完成所有操作
perl -MPOSIX=strftime -wE'$d = shift || ".";
say strftime("%Y-%m-%d", localtime((stat $_)[9])), "; $_"
for sort { (stat $b)[9] <=> (stat $a)[9] } glob "$d/*log*"
' dir-name
Run Code Online (Sandbox Code Playgroud)
你提交dir-name
到一行的地方(或者它与.
当前目录一起工作).
注意,我没有看到find
您需要从目录中获取(日志)文件的列表.
这可以优化,不stat
重复运行,但我怀疑它在预期使用中很重要.我建议把它放在一个漂亮的小脚本中.
仍然,stat
并不便宜,如果这经常捕获长文件列表然后使用
perl -MPOSIX=strftime -wE'$d = shift || ".";
say strftime("%Y-%m-%d", localtime($_->[1])), "; $_->[0]"
for
sort { $b->[1] <=> $a->[1] }
map { [$_, (stat $_)[9]] } glob "$d/*log*"
' dir-name
Run Code Online (Sandbox Code Playgroud)
在那里我将声明分成更多的行以强调变化.
输入文件列表from glob
用于首先构建另一个列表,使用map
每个文件名的arrayref:名称本身和该文件的时间戳.然后,成对比较sort
不必stat
每次都运行; 他们使用预先计算过一次的时间戳.这称为Schwartzian变换.此外,sprintf
不需要stat
再次运行.
请注意,优化带来了开销,因此只有在确实需要时才使用它.例如,参见本文(上一节)的讨论和链接.
归档时间: |
|
查看次数: |
75 次 |
最近记录: |