Com o bash, um loop simples com alguma manipulação de string
for f in ./*.ZIP.*
do
mv "$f" "${f%.*}"
done
"${f%.*}"
remove tudo após o último .
(inclusive) na string em $f
.
Eu preciso substituir as extensões de arquivos dinâmicos que contêm registro de data e hora para uma determinada data com uma extensão de arquivo fixa.
Por exemplo,
08242016G0040156.ZIP.20160907141452
09042016SHOC0003.ZIP.20160904044504
Eu preciso que eles sejam substituídos por 08242016G0040156.ZIP
e 09042016SHOC0003.ZIP
respectivamente.
for filename in $(find . -name '*ZIP*'); do mv $filename $(echo $filename | sed 's|\(.*\)\.ZIP.*|.ZIP|g') ; done
Com o comando perl
based rename
:
$ touch 08242016G0040156.ZIP.20160907141452 09042016SHOC0003.ZIP.20160904044504
$ rename -n 's/\.\d+$//' *ZIP*
rename(08242016G0040156.ZIP.20160907141452, 08242016G0040156.ZIP)
rename(09042016SHOC0003.ZIP.20160904044504, 09042016SHOC0003.ZIP)
A opção -n
é para execução a seco. Se a renomeação estiver correta, remova-a para uma renomeação real
Se os arquivos puderem estar em vários subdiretórios, use find
find -name '*ZIP*' -exec rename -n 's/\.\d+$//' {} +
Se houver caracteres diferentes de dígitos após o último .
use
rename -n 's/\.[^.]+$//' *ZIP*