Bash将多个纪元值转换为日期时间

时间:2016-07-03 10:24:26

标签: bash unix-timestamp

我有FirebaseAuth.getInstance().getCurrentUser()形式的多个文件,我希望每个文件都能获得每个文件的日期时间值(YYYYMMDDHHMMSS)。

到目前为止我已经

foo_[SECONDS.MILLISECONDS]_bar.tar.gz

但是这个错误就是

  

日期:无效日期' 1467535262.712041352'

如何将纪元值的bash管道转换为日期时间字符串?

MWE

ls -1 /filestore/*.tar.gz | cut -d _ -f 2  | date -f -

4 个答案:

答案 0 :(得分:2)

要将纪元时间转换为datetimem,请尝试以下命令:

    date -d  @1346338800 +'%Y%m%d%H%M%S'

1346338800是一个纪元时代。

关于您的情况,对于命令行如下:

echo 1467535262.712041352 | cut -d '.' -f 1 | xargs -I{} date -d @{} +'%Y%m%d%H%M%S'

你会得到:

20160703174102

答案 1 :(得分:1)

这样的东西?

for f in /filestore/*.tar.gz; do
    epoch=${f#*_}
    date -d @${epoch%%.*} +%Y%m%d%H%M%S
done

date命令的语法在平台之间有所不同;我假设在Linux上常见的GNU date。 (如果你在每个时间戳之前添加date -f,你可能会使用@,但我现在不在我可以测试它的地方。)运行循环使一些事情变得更容易,例如打印输入文件名和转换日期,否则管道将是最有效和惯用的解决方案。

另外,basically never use ls in scripts

答案 2 :(得分:1)

首先,-1的{​​{1}}选项是无用的,因为默认情况下ls每行打印一个文件输出,只是当输出是终端(不是管道)时,它很漂亮列中的印刷品。您只需运行ls即可查看该事实。

然后,只有在ls | cat作为前缀的情况下,日期才会安全地转换纪元时间戳。

@

给出了:

% date -d 0
Sun Jul  3 00:00:00 CEST 2016
% LANG=C date -d @0
Thu Jan  1 01:00:00 CET 1970

% date -d 12345
date: invalid date '12345'
% date -d @12345
Thu Jan  1 04:25:45 CET 1970

答案 3 :(得分:0)

你可以这样做:

for i in foo_*_bar.tar.gz; do date -d "@$(cut -d_ -f2 <<<"$i")" '+%Y%m%d%H%M%S'; done

纪元时间由-d @<time>提供,所需格式为'+%Y%m%d%H%M%S'

示例:

% for i in foo_*_bar.tar.gz; do date -d "@$(cut -d_ -f2 <<<"$i")" '+%Y%m%d%H%M%S'; done
20160703001158
20160703144102