如何使用 find 和 Perl 列出文件?
How can I list files with find and 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
我正在使用 for
逐行阅读
所以我怎样才能得到日期和 path/filename
在 txt 中由 ;
分隔,使用 bash 和最终 perl 按日期降序排序,谢谢!
find /home/user/Documents/*.log* -type f -exec perl -MPOSIX -le 'print strftime("%Y%m%d",localtime((stat $ARGV[0])[9])),";$ARGV[0]"' {} \; | sort -k1,1
可以在 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
我将声明分成更多行以强调更改。
来自 glob
的输入文件列表用于首先构建另一个列表,使用 map
,每个文件名都有一个 arrayref:名称本身 和 该文件的时间戳。然后 sort
中的成对比较不必每次都 运行 stat
;他们使用预先计算过一次的时间戳。这称为 Schwartzian transform。此外,sprintf
也不需要再次 运行 stat
。
请注意,优化会带来开销,因此仅在确实需要时才使用它。例如,请参阅 this post(最后一部分)以获取讨论和链接。
我在基于 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
我正在使用 for
逐行阅读
所以我怎样才能得到日期和 path/filename
在 txt 中由 ;
分隔,使用 bash 和最终 perl 按日期降序排序,谢谢!
find /home/user/Documents/*.log* -type f -exec perl -MPOSIX -le 'print strftime("%Y%m%d",localtime((stat $ARGV[0])[9])),";$ARGV[0]"' {} \; | sort -k1,1
可以在 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
我将声明分成更多行以强调更改。
来自 glob
的输入文件列表用于首先构建另一个列表,使用 map
,每个文件名都有一个 arrayref:名称本身 和 该文件的时间戳。然后 sort
中的成对比较不必每次都 运行 stat
;他们使用预先计算过一次的时间戳。这称为 Schwartzian transform。此外,sprintf
也不需要再次 运行 stat
。
请注意,优化会带来开销,因此仅在确实需要时才使用它。例如,请参阅 this post(最后一部分)以获取讨论和链接。