Bash: renomear e remover extensão de arquivo
Autor: Iggy | Publicado: 2012-01-20T01:04:00-02:00

#!/bin/bash

## Algumas vezes eu tenho casos onde eu preciso mudar a extensão de vários arquivos.

## Por exemplo, outro dia consegui recuperar torrents de um disco antigo, mas os nomes de arquivos estavam todos alterados por vários programas diferentes. Além da extensão .torrent, eles tinham .loaded, .part, .ut!, .!bc, e alguns até tinham mais de uma dessas extensões.

## Basicamente pra renomear vários arquivos utiliza-se somente o comando mv.

## Agora no meu caso eu precisei fazer alguns testes nos arquivos, e eu tinha arquivos em vários diretórios e sub-diretórios, então eu tive que usar ou loops com testes usando ls e cd ou find.


## Mas por enquanto vou me limitar a explicar a sintaxe básica que altera ou remove uma extensão de arquivo.

## Aqui, os argumentos passados quando se invoca o script são atribuídos a estas variáveis.
#ARQUIVO=$1
#EXTENSAO_ANTIGA=$2
#EXTENSAO_NOVA=$3

## Mas antes eu vou testar pra ver se o animal que rodou o script mandou os comandos certos. Então na verdade as primeiras linhas ficariam assim:

if [[ ! -z $1 &amp;&amp; ! -z $2 ]]
then
&nbsp;&nbsp;ARQUIVO=$1
&nbsp;&nbsp;EXTENSAO_ANTIGA=$2else&nbsp;&nbsp;echo "Uso: $0 ARQUIVO EXTENSAO_ANTIGA [EXTENSAO_NOVA]"&nbsp;&nbsp;exitfi
## Eu só testei os dois primeiros parâmetros no primeiro teste, porque eu quero poder rodar o script sem o terceiro parâmetro. O terceiro parâmetro seria a extensão nova no caso de eu querer renomear. Se eu omitir o terceiro parâmetro, o script vai apagar a extensão antiga.

## Agora o comando propriamente dito:


mv "$ARQUIVO" "`basename "$ARQUIVO" .$EXTENSAO_ANTIGA``test [ &nbsp;! -z $3 ] &amp;&amp; echo ".$3"`"
## Beleza, na verdade esse é o comando mv com os dois parâmetros normais: o primeiro é o arquivo que eu quero renomear. o segundo, na verdade é uma das formas de se fazer isso, mas não é a única. o comando basename na verdade por padrão remove o caminho absoluto do arquivo e deixa só o nome do arquivo, e se tu especificar um segundo parâmetro (nesse caso a extensão), ele vai tirar a extensão também. Ainda no segundo parâmetro eu tenho outro teste, que vai adicionar a extensão nova caso o terceiro parâmetro tenha sido informado. Basicamente o que vai aparecer para o comando mv, presumindo que eu tenha um arquivo Books.7z.torrent.loaded e queira tirar o ".loaded", eu invoque o comando assim:
## bash tratarExtensao.sh ~/trf/tor/Books.7z.torrent.loaded loaded
## O comando mv na verdade vai ser chamado assim: mv Books.7z.torrent.loaded Books.7z.torrent
## Isso acontece porque eu invoco dois subshells (usando os ``), um deles é o comando "basename Books.7z.torrent.loaded .loaded" que vai ter como saída "Books.7z.torrent", e outro teste que teria como saída o terceiro parâmetro, caso este existisse. Essa saída é interpretada como texto, como o segundo parâmetro pelo comando mv.
## A maioria das pessoas pode ser que não entenda porque isso precisa ser feito dessa forma. Bom, na verdade não tem como renomear arquivos depois que eles foram criados. O que a gente pode fazer é criar outro arquivo idêntico em outro lugar no disco, com outro nome. A forma abstrata de denominar este processo é "cópia". Na verdade a operação de mover arquivo é nada mais que uma operação de "cópia" seguida de uma operação de "exclusão".
## Na verdade em disco magnético também não tem como apagar arquivos, ainda tem algumas pessoas que acham que enviar seus arquivos pra lixeira ou usar comandos de "excluir" vão garantir que ninguém nunca mais acesse aqueles arquivos. Acho que a única forma de garantir que ninguém acesse é derretendo o disco.