![更改文件名中的日期格式](https://linux22.com/image/1005171/%E6%9B%B4%E6%94%B9%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%A0%BC%E5%BC%8F.png)
我正在接收电子邮件,文件名格式如下(日期 + 的 Unix 格式.report-server
)
1509106656.32538_1.report-server
现在我有几封电子邮件。我想用新的日期时间格式格式化所有文件名,如下所示。
dd-mm-yyyy.report-server
答案1
这个怎么样:
for i in *.report-server; do echo mv "$i" "$(date -d@${i%%.*} +%d-%m-%Y.${i##*.})"; done
这将循环遍历.report-server
当前目录中的文件,并为每个文件打印一行,例如
mv 1509106656.32538_1.report-server 27-10-2017.report-server
您可以在其中检查文件名。如果它符合您的要求,只需echo
从命令中删除并运行它即可执行重命名。
当心!如果您最终拥有多个具有相同日期的文件,mv
则(默认情况下)将默默覆盖第一个文件。如果您想保留(可能唯一的).32538_1
部分,请在命令中更改${i##*.}
为。如果您想在覆盖文件之前询问,请添加选项。${i#*.}
mv
-i
答案2
您可以使用以下脚本作为提示:
#!/bin/bash
for i in *.report-server; do
timestamp=$(echo $i | cut -d. -f1)
output_date=$(date +'%d-%m-%Y' -d @$timestamp)
mv "$i" "${output_date}.report-server"
答案3
这里有一个使用基于 perl的方法(本质上rename
是prename
如何批量将文件夹名称从一种日期格式转换为另一种日期格式,具有不同的格式说明符):
$ rename -n -- '
BEGIN{use Time::Piece};
s/(\d{10})\.\d{5}_1/Time::Piece->strptime($1, "%s")->strftime("%d-%m-%Y")/e
' *.report-server
rename(1509106656.32538_1.report-server, 27-10-2017.report-server)
当您对它正在执行所需的操作感到满意时,请删除-n
(或者如果您想要详细输出,则更改为)。-v