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

Bash: epoch time stored in variable pass into date command and make folder name

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

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 }'`
    epoch=`echo $x | awk -F"_" '{print }'`
    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 的回答对脚本做了一些修改

hrdate 定义中有尾部 space,应该是这样的:

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

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

这是一个重构版本,其中包含以下更改:

  • 修复 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

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

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

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

这对我有用