У меня есть несколько файлов с именами
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 блоков.
Обновление после комментария 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