2017-04-05 66 views
1

我有一组名称如4,_4_201703140220,_4_201703150220。其中第一个数字是目录ID,尾部数字是ISO标准日期字符串。 Jenkins使用了这些,但这可能与此无关。如何在Linux中按日期获取最新的目录?

下面是一个示例清单:

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

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

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

+1

你忘了提及,所以在情况下,没有明显的人在这里附加在末尾的数字是日期字符串,海报想对应的最近日期只有目录。这是一个正确的总结吗?另外,我们可以假设这是一个Unix终端吗? –

+0

OOPS对不起..但你得到它..在它上面编辑 –

+0

否则,假设目录的时间戳也写日期顺序,这将做你想要的https://unix.stackexchange.com/questions/136976/get -the-latest-directory-not-the-latest-file'ls -td - * | head -n 1'这会按时间戳排序目录(不是文件名),然后获取列表中的第一个。 – ti7

回答

0

我发现自己创建一个怪物,但假设你只想与在它以这样的形式结束的最近日期的文件,这个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)找到基于一个特殊键
最大这就允许我们用一个函数来告诉我们,如果“红”是不是“蓝”变大

lambda x: x[1]创建inlinefunction(称为拉姆达)仅返回
对于含有[1, 'r', 3, 'z', 'b']列表,它将在位置1返回元件可迭代(我们可以通过寻找列表)的一部分,'r'

我们使用它来查找“最大”日期,该日期方便地是您的方案中最新的日期(201703150220大于201603150220)。

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

然后取[0]指数得到返回的元组(文件名)的第一个值。
("_4_201703150220", "201703150220")[0]成为"_4_201703150220"

+0

这只适用于一个案件。我最近编辑了这个问题请参考。谢谢,虽然 –

+0

这与你最初的问题有很大的不同 - 你是否只想保留每一天的最新目录? – ti7

+0

不是每一天,但U可以考虑。下划线之间的数字是一个id –