如何在 Bash 中按年份重命名多个文件

如何在 Bash 中按年份重命名多个文件

我有多个文件命名为

DOWN_1981_1.31.nc
DOWN_1982_1.31.nc
...
DOWN_2010_1.31.nc

我想将它们重命名为

DOWN_2040_1.31.nc
DOWN_2040_1.31.nc
DOWN_2041_1.31.nc
...
DOWN_2069_1.31.nc

如何最好地使用单行 bash 脚本来执行此操作?

第一批文件的时间集是从 1981 年到 2010 年,我想将其重命名为 2040 年到 2069 年。两种情况下的时间块都是 30。

答案1

原帖评论后更新

在 OP 评论说并非所有文件都具有格式之后DOWN_1981_1.31.nc,但也有一些文件被格式化为,我之前给出的解决G_DOM_WC_m3_1981.nc方案awk似乎不适合这项工作。

下面使用的脚本sed稍微复杂一些,但似乎运行良好(首先cd进入包含文件的目录):

for file in *;do mv $file $(echo $file | sed -r 's/(.*)([0-9]{4})(.*)/echo "\1$(echo "\2 + 59" | bc)\3"/e');done

该脚本使用正则表达式来捕获和更改目录中所有文件的文件名中恰好有 4 位数字( )的年份,而([0-9]{4})文件名的其余部分保持不变。


旧解决方案

以下简单的脚本可以为您完成此操作(首先cd进入包含文件的目录):

for file in *;do mv $file $(echo $file | awk -F "_" '/DOWN/{print $1"_"$2 + 59"_"$3}');done

相关内容