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 格式。
这对我有用
我正在编写一个脚本,根据文件名中包含的纪元时间创建子文件夹。 这是一个示例文件名;
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 格式。
这对我有用