bash - 如何使用 find 和 Perl 列出文件?
问题描述
我在基于 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
我试过这个:
find /home/user/Documents/*.log* exec perl -MPOSIX -e 'print POSIX::strftime "%Y%m%d\n", localtime((stat $ARGV[0])[9])'
但我无法得到我需要的东西,我不能使用stats
我正在使用 afor
逐行读取所以我怎样才能在 txt 中获取日期和path/filename
由 a 分隔的;
日期,使用 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
您将 提交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
我将声明拆分为更多行以强调更改。
输入文件列表 fromglob
用于首先构建另一个列表,使用map
,每个文件名都有一个数组引用:名称本身和该文件的时间戳。sort
然后不必stat
每次都进行成对比较;他们使用预先计算过的时间戳。这称为Schwartzian 变换。此外,sprintf
也无需stat
再次运行。
请注意,优化会带来开销,因此仅在确实需要时才使用它。例如,请参阅这篇文章(最后一部分)以获取讨论和链接。
推荐阅读
- html - Font-Awesome 仅在 Firefox 中显示随机方块
- javascript - 动画正在进行时暂停调度 NgRx 动作
- r - 如何从大型 shapefile 计算多边形的面积
- java - sam build 无法找到 pom.xml 文件
- c++ - 重新安装 Visual Studio 2017 后如何为 Qt 配置可用的工具包
- ggplot2 - ggplot:如何从一个方面删除未使用的因子水平?
- java - 为什么在 Android Studio 的(内存)Profiler 中 FinalizerReference 类的保留堆大小如此之大?
- android - 当方法不存在时如何在“数据库”对象上调用“集合”方法
- django - Django-storages:在本地保存缓存版本以提高读取速度
- google-maps - GoogleMap 的 onCameraIdle 在 SingleChildScrollView 中停止触发