Este pequeno script renomeia os arquivos sem movê-los
n=0; for files in dir1/*.MOD dir2/*.MOD dir3/*.MOD; do printf -v new "${files/MOV*./%02d.}" "$((++n))"; echo mv -v "$files" "$new"; done
ou mais legível:
#!/bin/bash
n=0
for files in dir1/*.MOD dir2/*.MOD dir3/*.MOD; do
printf -v new "${files/MOV*./%02d.}" "$((++n))"
echo mv -v -- "$files" "$new"
done
Substitua dir1
etc pelos caminhos reais para seus diretórios com os arquivos
Remova echo
(é só para testar) depois de verificar se isso fornece o que você deseja, para realmente renomear os arquivos.
Isso contém os arquivos 01.MOD
, 02.MOD
, etc. Se você tiver mais de 99 arquivos, substitua %02d
por %03d
para obter 001.MOD
etc
Explicação:
n=0
Isso apenas define n
como 0
, que é onde eu quero que o bash comece a contar.
for files in dir1/*.MOD dir2/*.MOD dir3/*.MOD
Um loop for
pode executar comandos iterativamente em cada arquivo por vez. A sintaxe é for [variable] in [these things I want to do something to] ; do [command(s)] $[variable]; done
, chamei a variável files
e encontrei seus arquivos usando um glob: *.MOD
é expandido pelo shell para qualquer arquivo cujo nome termine em .MOD
( *
corresponde a qualquer caractere)
printf -v new
printf
pode formatar os novos números com uma largura fixa para facilitar a classificação. new
é outra variável - este é o novo nome dos arquivos.
"${files/MOV*./%02d.}" "$((++n))"
Referenciando a variável files
do anterior e substituindo MOV*
(lembre-se *
de qualquer caractere) com o resultado do número incremental $((++n))
(isso é n
da primeira linha do script, vá por um de cada vez que o loop é executado em um arquivo) formatado usando o código %02d
que para printf
significa um número decimal de uma largura fixa de dois dígitos 01, 02 etc. O padrão de pesquisa e substituição inclui o .
para parar *
correspondendo ao nome do arquivo inteiro e, assim, removendo a extensão.
echo mv -v -- "$files" "$new"
Eu adiciono o echo
apenas para testes - isso mostra o que será feito em vez de realmente fazê-lo. Remova o eco quando estiver satisfeito com o resultado para realmente executar o comando.
mv
renomeia ou move arquivos; sua sintaxe é mv oldname newname
. Eu adicionei o -v
sinalizador que diz mv
para ser "detalhado" e relatar cada ação. Eu adicionei --
apenas para estar seguro - isso diz mv
para não aceitar mais opções, o que impede que qualquer nome de arquivo começando com -
seja interpretado como opções para o comando - não é necessário no seu caso, mas uma boa prática.
Cada arquivo especificado pela variável files
é mv
ed para um nome exclusivo criado na variável new
. Usamos $
para fazer referência a variáveis e elas devem estar em "aspas duplas" para evitar que o shell faça outras expansões nos nomes de arquivos - isso impede que caracteres especiais ou espaços em nomes de arquivos causem problemas.