【问题标题】:better way to avoid use of ls inside of variable避免在变量内部使用 ls 的更好方法
【发布时间】: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


【解决方案1】:

感谢 Cyrus 建议的页面,我选择了这个解决方案:

  echo "$file"|grep "$stream"|rev|cut -d'_' -f2|rev|sort|tail -1
done < <(find "$streamPath" -maxdepth 1 -type f -name '*.zip' -print0)

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多