【发布时间】:2018-03-01 08:05:07
【问题描述】:
不确定如何正确命名,如果您愿意,请更改它
鉴于我的代码确实有效,我希望进行同行评审以提高其质量。
我有一个装满 .zip 文件的文件夹。这些文件是每天卸载的数据流(可通过其流名称识别)。每个流每天可能有一个以上的文件,所以我需要按时间顺序抓取最后一个。我不能为此依赖 posix 时间戳,因此文件会在其名称上公开时间戳。
文件名示例:
XX_XXYYZZ_XYZ_05_AB00C901_T001_20170808210052_20170808210631.zip
- 最后两个字段是时间戳,我对倒数第二个感兴趣。
- 其他字段无用(现在)
我之前存储了流名称(在本例中为 XYZ_05_AB00C901_T001 在变量 $stream 中
我有这行代码:
match=$(ls "$streamPath"/*.zip|grep "$stream"|rev|cut -d'_' -f2|rev|sort|tail -1)
它的作用是在给定的路径中搜索与流匹配的文件,删除时间戳并对它们进行排序。所以现在我知道了这个流的最后一个时间戳是什么,我可以再次ls,这一次同时搜索$stream和$match,我就完成了:
streamFile=$(ls "$streamPath"/.zip|grep "$stream.*$match\|$match.*$stream")
提问时间:
有没有更好的方法来实现我的目标?可能不止一个,我更喜欢单线解决方案,强硬。
ShellChecks 建议我最好使用
for循环或while循环而不是ls,以便能够处理特定的文件名(我不是面对ATM,而是谁知道),但我不太确定(对我来说似乎更复杂)。
谢谢。
哦。
【问题讨论】:
-
显示
ls的示例输出,以及命令的预期输出。 -
您可能希望以更完整的方式编写您的示例,并通过Code Review 寻求批评。请务必先阅读A guide to Code Review for Stack Overflow users,因为那里有些事情的做法不同!
-
那个时间戳是不是反映了文件的真实修改时间?
-
这可能会有所帮助:Bash Pitfalls
标签: linux bash shell variables ls