在 bash 中提取并格式化时间戳

在 bash 中提取并格式化时间戳

我有一个脚本返回一个文件列表,其中包含每个文件的完整路径。对于例如 - root/folder/file@1610565763436。因此,输出看起来像

/root/folder/file@1610565763436
/root/folder/file@1610568241000
/root/folder/file@1610597041000
/root/folder/file@1610625841000
/root/folder/file@1610654641000
/root/folder/file@1610683441000
/root/folder/file@1610712242000
/root/folder/file@1610741041000
/root/folder/file@1610769841000
/root/folder/file@1610798641000
/root/folder/file@1610827441000
/root/folder/file@1610856241000
/root/folder/file@1610885041000
/root/folder/file@1610913841000

我想格式化输出,以便仅将人类可读的时间戳作为输出。我尝试执行 acut -d "@" -f 2来获取时间戳,但将其管道传输到 xargs 并运行日期命令对我来说不起作用。 IE /bin/bash scriptToGetFiles | cut -d "@" -f 2 | xargs date -d {}

FWIW,运行上述命令会xargs -t返回错误

date -d @ 1610565763436 1610568241000 1610597041000 1610625841000 1610654641000 1610683441000 1610712242000 1610741041000 1610769841000 1610798641000  
date: extra operand ‘1610568241000’

我将不胜感激任何建议或指示。

答案1

使用 GNU 日期:

$ echo /root/folder/file@1610565763436 | cut -d@ -f2 | xargs -I '{}' echo {} / 1000  | bc  | xargs -I '{}' date --date=@{}
Wed Jan 13 20:22:43 CET 2021

在 FreeBSD 上:

$ echo /root/folder/file@1610565763436 | cut -d@ -f2 | xargs -I '{}' echo {} / 1000  | bc  | xargs  date -r
Wed Jan 13 20:22:43 CET 2021 

答案2

使用普通的 bash,printf可以格式化 Epoch 时间:

processThatOutputsStuff | while IFS=@ read -r path date; do
    printf '%(%c)T\n' "${date%???}"
done

${date%???}是一个参数扩展从变量值中删除最后 3 个字符。

如果您想要不同的日期时间格式,请替换%c.

相关内容