Renomeia e converte datas em nome de arquivo sem extensão de arquivo

3

Meu conjunto de arquivos é nomeado de acordo com o fuso horário GMT. Eu renomei e converti com sucesso todos os arquivos para o fuso horário necessário usando as etapas a seguir.

1. Este código remove todas as extensões de arquivo que são .gif rename "s/.gif//g" *

2. Este código converte e renomeia todos os arquivos for f in *; do mv -v -- "$f" "$(date -d "$f" '+%Y%m%d%H%M')"; done

  • Exemplo de conversão: ‘15Z29Aug2017’ -> ‘201708292030’

Infelizmente eu tenho que definir a extensão .gif mais uma vez para todos os arquivos usando for f in *; do mv "$f" "$f.gif"; done

Como exatamente posso pular a remoção da extensão do arquivo editando meu código na etapa 2?

Passo 2 retirado de: Como posso converter em lote nomes de pastas de um formato de data para outro

    
por csheth 29.08.2017 / 19:55

1 resposta

4

Tudo o que você precisa é remover .gif de $f e colocá-lo de volta em:

for f in *; do mv -v -- "$f" "$(date -d "${f%%.gif}" '+%Y%m%d%H%M')".gif; done

${f%%.gif} usa a variável f e remove a última ocorrência (portanto, # duas vezes) de .gif , portanto, mesmo um nome de arquivo estranho como 1.gif2.gif obteria apenas seu último .gif removido. Este incrível recurso é chamado de Expansão de Parâmetros Bash e quando você procura por este nome, você pode ler tudo sobre o seu poder deslumbrante, e. g. em este FAQ do Bash - é capaz de muito mais!

    
por dessert 29.08.2017 / 20:05