Bash,根据其日期名称获取最新文件夹

时间:2016-12-17 18:26:20

标签: bash directory

任何人都可以告诉我如何根据其名称获取最新文件夹的名称,该名称使用bash格式化为日期。例如:

20161121/
20161128/
20161205/
20161212/

输出应为:20161212

2 个答案:

答案 0 :(得分:3)

根据反向数字排序,只需使用带有GNU sort标记的-nr

find . ! -path . -type d | sort -nr | head -1

示例结构,我在当前路径中有以下文件夹的列表,

find . ! -path . -type d 
./20161121
./20161128
./20161205
./20161212

了解sort如何选择您需要的文件夹

find . ! -path . -type d | sort -nr
./20161212
./20161205
./20161128
./20161121

head -1仅用于第一次参赛,

find . ! -path . -type d | sort -nr | head -1
./20161212

将其存储在变量中,使用命令替换$()作为

myLatestFolder=$(find . ! -path . -type d | sort -nr | head -1)

答案 1 :(得分:0)

如果您想要的只是一个条目,那么对所有内容进行排序似乎是额外的工作。如果您需要对大量条目进行排序,则可能会出现问题。另外,您应该注意,基于find的解决方案默认会遍历子目录,这些子目录可能是也可能不是您所追求的目标。

$ shopt -s extglob
$ mkdir 20160110 20160612 20160614 20161120
$ printf '%d\n' 20+([0-9]) | awk '$1>d{d=$1} END{print d}'
20161120
$

虽然模式20+([0-9])没有精确匹配日期(如果没有至少几行代码,很难验证日期),我们至少得到了一些通过printf输入验证,并使用简单的“打印最高”awk单行来解析printf的结果。

哦,此外,它会处理任何名称相应的目录条目,并且不会验证它们本身就是目录。这也需要额外的测试或不同的工具。

要求项目为目录的一种方法是使用尾部斜杠:

$ touch 20161201
$ printf '%s\n' 20+([0-9])/ | awk '$1>d{d=$1} END{print d}'
20161120/

但是丢失了输入验证(%d的{​​{1}}格式)。

如果您愿意,可以为您的目录名称构建完整模式:

printf