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
.