只考虑到时间戳的小时数?

时间:2017-10-31 20:53:38

标签: shell

我正在尝试调用一个包含时间戳%Y%m%d%H%M%S的文件,在此,如何通过排除分钟和秒来考虑直到几小时?

1 个答案:

答案 0 :(得分:0)

有许多可能的方法来映射完整的文件名,例如:

/some/where/abc_abc_abd_abc_abc_20170914092632.txt

(其中名称包括秒组件 - 示例中为32)到没有分钟或秒(或路径前缀)的名称。

使用sed

的替代方案

假设变量持有名称为vFileName,则可以使用:

vFile=${vFileName##*/}   # Remove path prefix
vFile=${vFile%.txt}      # Remove .txt suffix
vFile=$(echo "$vFile" | sed 's/_\([12][8901][0-9][0-9][01][0-9][0-3][0-9][012][0-9]\)[0-9]\{4\}$/_\1/')

这是对半日验证日期/时间字符串的相当严重的尝试;它要求一年的第一个数字是1或2;第二个是8,9,0或1(18xx,19xx,20xx,21xx),同样限制月,日,小时;然后删除(未经验证的超过"它必须是数字")分钟和秒。使用示例名称,您将$vFile包含:

abc_abc_abd_abd_abc_2017091409

你从那里做什么取决于你。您可以使用更简单/更短的模式匹配(对其接受的内容不那么严格):

vFile=$(echo "$vFile" | sed 's/_\([0-9]\{10\}\)[0-9]\{4\}$/_\1/')

使用给定的示例数据,它会产生相同的结果。

仅使用shell

的替代方案

验证更少,您可以使用以下方法从有效数据中获得相同的结果:

vFile=${vFileName##*/}                       # Remove path prefix
vFile=${vFile%[0-9][0-9][0-9][0-9].txt}      # Remove ####.txt suffix

删除最后4位数字和.txt后缀。由于这不涉及外部命令,因此可能是最快的。这应该适用于任何合理的POSIX兼容shell(Bash,Korn,Dash,Zsh,...)。