Que tal esta solução Bash?
#!/bin/bash
shopt -s nullglob extglob
for file in +([[:digit:]]).bil; do
file_noext=${file%.bil}
year=${file_noext::4}
day=${file_noext:4}
[[ -z $day ]] || ((0<=day && day<=152 && ${#year}==4)) || { echo "Error with file $file"; continue; }
newname=$(date -d "$year-08-01 + $day days" '+%Y%m%d.bil')
echo mv -nv "$file" "$newname"
done
- Isso fará o loop de todos os arquivos do formulário
X.bil
, em queX
é um número (composto apenas por dígitos). - Para cada arquivo e depois de extrair a extensão
.bil
, extraímos os primeiros quatro caracteres (oyear
) e obtemos os dígitos restantes na variávelday
. - Em seguida, há uma linha que verifica se está tudo ok (
day
não está vazio, entre 0 e 152 eyear
tem 4 caracteres). - Depois disso, usamos o utilitário
date
(esperamos que você tenha umdate
inteligente como o meu que pode realizar aritmética com datas, aqui adicione dias a um determinado). - Finalmente, realizamos a renomeação (bem, deixei um
echo
na frente demv
, para que o comando seja mostrado apenas, não executado; remova oecho
se estiver satisfeito com ele).
Teste. Chamei esse script de banana
(com echo
removido) e chmod +x banana
. Então:
$ mkdir scratch
$ cd scratch
$ touch 2011{0,42,100,151}.bil
$ ls
20110.bil 2011100.bil 2011151.bil 201142.bil
$ ./banana
'20110.bil' -> '20110801.bil'
'2011100.bil' -> '20111109.bil'
'2011151.bil' -> '20111230.bil'
'201142.bil' -> '20110912.bil'
$ ls
20110801.bil 20110912.bil 20111109.bil 20111230.bil
Parece bom!