O comando rename (você também pode executá-lo como file-rename ) é bem adequado para esta tarefa. Existem algumas maneiras de usá-lo aqui. Sugiro isso, mas mostrarei uma alternativa abaixo:
rename -n 's/^\d{8}_\d\d\K\.\d+//' *.gif
A opção -n faz com que seja impressa qual das operações de renomeação seria a primeira. Quando estiver satisfeito com isso, execute-o novamente sem -n para fazer a renomeação real. Um dos benefícios de rename é que ele não sobrescreverá arquivos (a menos que você passe a -f opção, o que você deve fazer muito raramente). Isso é especialmente bom aqui porque você está removendo partes de nomes de arquivos que potencialmente poderiam resultar em colisões de nomes. Mesmo que as colisões não sejam detectadas quando você executar a simulação com -n , elas serão capturadas quando você executar a renomeação real.
Com os quatro arquivos que você mostrou, esse comando mostrará esta saída:
rename(22771786_01.204.gif, 22771786_01.gif)
rename(22771786_02.203.gif, 22771786_02.gif)
rename(22771786_03.10.gif, 22771786_03.gif)
rename(22771786_04.56.gif, 22771786_04.gif)
Naturalmente, sua saída será maior se você tiver mais de quatro arquivos, o que eu presumo que você faça.
A maneira como o comando funciona é que s/ executa a substituição. Os nomes de arquivos que contêm texto que corresponde à expressão regular ^\d{8}_\d\d\K\.\d+ são alterados para que a correspondência é apagada, ou seja, substituída pela string vazia que está entre / e / no // que a segue.
Embora a expressão regular possa ser escrita de modo a garantir que apenas os arquivos terminados em .gif sejam operados, isso é desnecessário, pois você pode passar apenas os% de nomes de arquivos co_de% para .gif . O shell expande rename para uma lista desses arquivos e passa essa lista para o comando *.gif . Note que a sintaxe que o shell usa para expansão de nome de arquivo é não é a mesma coisa como expressões regulares . rename não tem o mesmo significado que nas expressões regulares.
Veja o que a expressão regular * faz:
-
^\d{8}_\d\d\K\.\d+ âncoras para o início da linha.
-
^ corresponde uma sequência de exatamente oito dígitos .
-
\d{8} corresponde a um literal _ . Não é especial.
-
_ corresponde a mais dois dígitos.
-
\d\d esquece os caracteres correspondentes anteriores . Esses são os personagens que queremos manter, afinal, não os que queremos substituir. O efeito é garantir que esses caracteres estejam presentes pouco antes da parte que iremos substituir.
-
\K corresponde a um literal \. . A barra invertida é necessária porque, quando um ponto aparece em uma expressão regular, ele corresponde a qualquer caractere único .
-
. corresponde a um ou mais dígitos .
Assim, é um \d+ seguido por dígitos que são removidos. Se o arquivo não começar com o padrão necessário, não haverá correspondência. Isso ajuda a evitar renomear arquivos que você não deseja renomear.
É possível escrever um comando . mais curto que deve funcionar. Eu escolhi essa abordagem - entre muitas abordagens possíveis - porque o comando expressa precisamente o esquema de nomenclatura no qual você deseja operar. Isto é para dizer que a solução se assemelha ao problema.
Se você quiser usar um comando rename mais simples, e você sabe que todos os arquivos rename no diretório atual são nomeados de acordo com sua descrição e precisam ser renomeados, você pode usar:
rename -n 's/\.\d+\.gif$/\.gif/' *
Lembre-se de que .gif apenas mostra o que será feito e, em seguida, você deve removê-lo para renomear os arquivos.
Nesse comando, incluímos o sufixo -n na expressão regular, para que você não precise filtrá-lo nos nomes de arquivo transmitidos para .gif . Ainda assim, você pode optar por fazer isso, se tiver muitos arquivos que não sejam rename no diretório atual que seriam correspondidos por .gif .
Veja o que a expressão regular * faz:
-
\.\d+\.gif$ corresponde a um literal \. . (Sem o . , um \ corresponde a qualquer caractere .)
-
. corresponde a um ou mais dígitos .
-
\d+ corresponde a outro literal \. .
-
. corresponde ao texto literal gif .
-
gif anchors a correspondência com o fim do nome do arquivo.
Assim, o ponto, os dígitos finais e o sufixo $ são correspondidos e todos são substituídos por apenas .gif .