Existem muitas maneiras de fazer isso. Aqui está um comando que deve funcionar para o seu exemplo:
for oldname in *; do
newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" \
&& mv -i "${oldname}" "${newname}";
done
Esse exemplo usou expressões regulares compatíveis com Perl que parece que seu grep
não suporta. Aqui está uma alternativa usando expressões regulares básicas:
for oldname in *; do
newname="$(echo "${oldname}" | grep -o 'ID[A-Z]\?[0-9]\+' | tr A-Z a-z).txt" \
&& mv -i "${oldname}" "${newname}";
done
Segue uma explicação mais detalhada.
A expressão for oldname in *
usa um padrão globbing / curinga para iterar os arquivos em seu diretório atual e armazena cada nome na variável oldname
. Para testar isso, você pode executar o seguinte:
for oldname in *; do echo "${oldname}"; done
Em seguida, usamos grep
para extrair a parte do nome do arquivo que você deseja manter. O sinalizador da opção -P
informa grep
para usar expressões regulares compatíveis com Perl (não é realmente necessário nessa situação) e o -o
sinaliza grep
para extrair apenas a subseqüência correspondente (em vez de imprimir a cadeia inteira). O padrão \w?
corresponde a um único caractere de opção (um caractere "palavra") e o padrão \d+
corresponde a um ou mais dígitos. Podemos testar a expressão regular assim:
for oldname in *; do echo "${oldname}" | grep -Po 'ID\w?\d+'; done
Em seguida, usamos tr
para converter caracteres maiúsculos em minúsculas:
for oldname in *; do echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z; done
O próximo passo é usar a substituição de comando para atribuir essa string a uma variável e depois imprimir a resultado:
for oldname in *; do
newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z)" && echo "${newname}"
done
Em seguida, adicionamos a extensão de arquivo ".txt":
for oldname in *; do
newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" && echo "${newname}"
done
Podemos executar este comando como uma verificação de integridade para garantir que estamos obtendo os resultados esperados. Quando estivermos satisfeitos, substituiremos o comando echo
por um comando mv
:
for oldname in *; do
newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" \
&& mv -i "${oldname}" "${newname}";
done