Как переименовать несколько файлов по годам в 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
задан 17 September 2019 в 14:01

1 ответ

Обновление после комментария OP

После комментария 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

Этот сценарий использует regex, чтобы получить и изменить только год, который имеет точно 4 цифры (([0-9]{4})), в имени файла всех файлов в каталоге, оставляя остальную часть имени файла, как.


Старое решение

Следующий простой сценарий может сделать это для Вас (сначала cd в каталог, содержащий файлы):

for file in *;do mv $file $(echo $file | awk -F "_" '/DOWN/{print $1"_"$2 + 59"_"$3}');done
0
ответ дан 7 December 2019 в 18:45

Другие вопросы по тегам:

Похожие вопросы: