【问题标题】:How to get the most recent directories by date in Linux?如何在 Linux 中按日期获取最新的目录?
【发布时间】:2017-04-05 02:11:24
【问题描述】:

我有一组目录,其名称为 4_4_201703140220_4_201703150220。其中第一个数字是目录 ID,后面的数字是 ISO 标准日期字符串。这些是 Jenkins 使用的,但这可能与这里无关。

这是一个示例清单:

_41_20170322145757/
_41_20170323110416/
_41_20170323110720/
_42_20170322095600/
_42_20170322103112/
_42_20170324120233/

每个目录都包含相同数据的修订版,但我想知道每个 ID 的最新版本。在上述情况下,这将是 _41_20170323110720/_42_20170324120233/

是否有一个简单的命令可以用来获取每个 ID 的最新目录列表?或者一个 python 文件也可以。

【问题讨论】:

  • 您忽略了提及,所以如果这里的任何人都不明显,最后附加的数字是日期字符串,并且张贴者只想要与最近日​​期相对应的目录。这是一个正确的总结吗?另外,我们可以假设这是一个 Unix 终端吗?
  • 糟糕,抱歉.. 但你明白了.. 可以编辑
  • 否则,假设目录的时间戳也是写入日期顺序,这将做你想要的unix.stackexchange.com/questions/136976/…ls -td -- * | head -n 1这将按时间戳(不是文件名)对目录进行排序,然后获得列表中的第一个.
  • 是否有可能以破坏目录名称中包含的日期字符串与实际日期/时间之间相关性的方式复制或更新目录?

标签: linux date terminal


【解决方案1】:

我发现自己正在创建一个怪物,但假设您只想要以该格式结尾的最新日期的文件,这个 Python 表达式应该可以满足您的需求:

python -c "import os; print max(((x, x.split('_')[-1]) for x in os.listdir('.')), key=lambda x: x[1])[0]"

说明

os.listdirs('.')获取当前路径下的所有目录

(x for x in y) 创建生成器表达式

.split('_')[-1] 拆分_ 上的每个目录名,只取最后一部分

max(<whatever>, key=value) 根据特殊键找到最大值
这允许我们使用一个函数来判断“red”是否大于“blue”

lambda x: x[1] 创建一个内联函数(称为 lambda),它只返回可迭代的一部分(我们可以搜索的列表)
对于包含[1, 'r', 3, 'z', 'b']的列表,它将返回位置1的元素'r'

我们使用它来查找“最大”日期,这很方便您的方案下最近的日期(201703150220 大于 201603150220)。

max() 然后返回一个包含完整文件名和我们尝试匹配的日期的元组
"_4_201703150220" 变为 ("_4_201703150220", "201703150220")

然后以[0] 索引获取返回元组中的第一个值(文件名)。
("_4_201703150220", "201703150220")[0] 变为"_4_201703150220"

【讨论】:

  • 这仅适用于案例。我最近编辑了这个问题,请参考。谢谢
  • 这与您最初的问题有很大不同 - 您是否尝试每天只保留最新的目录?
  • 不是每天,但你可以考虑。下划线之间的那些数字是一个id
猜你喜欢
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多