Сzsh
:
zmodload zsh/datetime
autoload zmv
zmv -n '(* )(<1-31>)??( ??? <1900-2100>)( *.txt)' \
'${1// /_}$(strftime %Y%m%d "$(strftime -r "%d %b %Y" $2$3)")${4// /_}'
Удалите -n
, когда будете довольны.
Это если месяц представляет собой трехсимвольную аббревиатуру. Если это полное имя:
zmodload zsh/datetime
zmodload zsh/langinfo
autoload zmv
zmv -n '(* )(<1-31>)?? ('${(vj:|:)langinfo[(I)MON_*]}')( <1900-2100>)( *.txt)' \
'${1// /_}$(strftime %Y%m%d "$(strftime -r "%d %B %Y" $2$3$4)")${5// /_}'
Предполагается, что имена файлов указаны на языке текущей локали. Если названия месяцев всегда на английском языке, вы можете установить LC_ALL=C
. В любом случае, если язык не английский, вы не можете обязательно ожидать, что аббревиатуры всегда будут состоять из 3 символов или th
, nd
, rd
будут состоять из двух символов, поэтому вам, вероятно, понадобится адаптировать.