Bash:存储在变量中的纪元时间传递给日期命令并制作文件夹名称

Posted

技术标签:

【中文标题】Bash:存储在变量中的纪元时间传递给日期命令并制作文件夹名称【英文标题】:Bash: epoch time stored in variable pass into date command and make folder name 【发布时间】:2021-03-25 22:50:15 【问题描述】:

我正在编写一个脚本,该脚本根据文件名中包含的纪元时间创建子文件夹。 这是一个示例文件名;

movie_lotr_frodo_1608020500_1608020510

想要的输出;

frodo/2020-12-15/movie_lotr_frodo_1608020500_1608020510

这是我的脚本;

dir="/root/user/test"
cd "$dir"

for x in *; do
    name=`echo $x | awk -F"_" 'print $3'`
    epoch=`echo $x | awk -F"_" 'print $5'`
    hrdate=$(date -r "$epoch" +%Y-%m-%d)
    mkdir -p "$name/$hrdate"
    mv -- "$x" "$name/$hrdate"
done

我得到了错误;

date: 1068020510: No such file or directory

它会创建 $name 文件夹,但不会创建 $hrdate 文件夹。用date -d 或未引用的$epoch 等日期尝试了几件事,但我不知道我在什么方面失败了。

编辑:我根据#tripleee 的回答对脚本进行了一些更改

【问题讨论】:

我在制作这个脚本时参考了这篇文章; unix.stackexchange.com/q/66494/434132 【参考方案1】:

这是一个重构版本,有以下更改:

修复syntax error with the illegal space after = 不要对目录进行硬编码;只需在您喜欢的任何目录中运行它 避免不必要地调用 Awk 来提取文件名部分 Quote everything
for x in ./*; do
    epoch=$x##*_
    tail=$x%"_$epoch"
    name=$tail%_*
    hrdate=$(date -r "$epoch" +%Y-%m-%d)
    mkdir -p "$name/$hrdate"
    mv -- "$x" "$name/$hrdate"
done

【讨论】:

【参考方案2】:

hrdate定义后面有个空格,应该是这样的:

dir="/root/user/test"
cd "$dir"

for x in *; do
    name=`echo $x | awk -F"_" 'print $3'`
    epoch=`echo $x | awk -F"_" 'print $5'`
    hrdate=$(date -r "$epoch" +%Y-%m-%d)
    mkdir -p $name/$hrdate
    mv -- $x $name/$hrdate
done

【讨论】:

我也试过了,好像没有效果。【参考方案3】:

我从man页面找到使用--date并添加@

hrdate=$(date +%F --date "@$epoch")

+%F 代表 YYYY-MM-DD 格式。

这对我有用

【讨论】:

以上是关于Bash:存储在变量中的纪元时间传递给日期命令并制作文件夹名称的主要内容,如果未能解决你的问题,请参考以下文章

通过回声管道将python变量(字符串)传递给bash命令[重复]

在linux bash中将ISO日期转换为纪元以来的秒数

bash文件将变量设置为纪元时间

在bash中将包含空格的变量传递给命令[重复]

在BASH中将日期作为STDIN传递给ruby函数[关闭]

如何在Python中将变量传递给bash命令