我有FirebaseAuth.getInstance().getCurrentUser()
形式的多个文件,我希望每个文件都能获得每个文件的日期时间值(YYYYMMDDHHMMSS)。
到目前为止我已经
了foo_[SECONDS.MILLISECONDS]_bar.tar.gz
但是这个错误就是
日期:无效日期' 1467535262.712041352'
如何将纪元值的bash管道转换为日期时间字符串?
ls -1 /filestore/*.tar.gz | cut -d _ -f 2 | date -f -
答案 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
,你可能会使用@
,但我现在不在我可以测试它的地方。)运行循环使一些事情变得更容易,例如打印输入文件名和转换日期,否则管道将是最有效和惯用的解决方案。
答案 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