任何人都可以告诉我如何根据其名称获取最新文件夹的名称,该名称使用bash格式化为日期。例如:
20161121/
20161128/
20161205/
20161212/
输出应为:20161212
答案 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