Como remover caracteres de nomes de arquivos usando a linha de comando?

3

Eu tenho um monte de arquivos que precisam ser renomeados, mas eu não quero criar um script para isso, apenas uma linha de comando.

Eu preciso remover os últimos dígitos entre o . e o .gif :

22771786_01.204.gif  
22771786_02.203.gif  
22771786_03.10.gif  
22771786_04.56.gif

Para ser assim:

22771786_01.gif  
22771786_02.gif  
22771786_03.gif  
22771786_04.gif
    
por A.V 14.11.2017 / 16:50

3 respostas

3

Você pode conseguir isso com um loop for e alguma expansão bash. Se você já estiver no diretório que contém os arquivos:

for f in ./*; do mv "$f" "${f%.*.gif}.gif" ; done

Se o seu diretório contendo os arquivos for chamado / home / gifstore /:

for f in /home/gifstore/*; do mv "$f" "${f%.*.gif}.gif" ; done

O ${f...} realiza a expansão de cada nome de arquivo que salvamos na variável chamada f . O % na expansão do nome do arquivo significa remover a correspondência mais curta do padrão a seguir do final da variável. O padrão é .*.gif , significando qualquer quantidade de caracteres entre . e .gif . Finalmente, anexamos a string literal .gif fora da expansão para criar nosso novo nome de arquivo, e contamos com o comando mv para mover o arquivo.

Isso não funcionará para arquivos ocultos, começando com . .

    
por Arronical 14.11.2017 / 17:20
1

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 .

    
por Eliah Kagan 14.11.2017 / 17:30
0

Eu pessoalmente gosto de usar o ranger para esse tipo de coisa. Ele usa atalhos de teclado do Vim para navegação e tal, então se você não estiver familiarizado com o vim, pode ficar confuso / difícil. Mas se você já está familiarizado com o Vim, deve ser uma tarefa simples!

Etapa 1

Instale ranger . Você pode instalá-lo como um plug-in Vim ou simplesmente baixar o arquivo .tar.gz do site .

Etapa 2

Execute o Ranger e navegue até o diretório que possui os arquivos que você deseja renomear. Eu recomendaria colocar todos os .gifs em um diretório. Certifique-se de que não há outros arquivos, exceto aqueles que você deseja renomear.

Etapa 3

Pressione v para selecionar todos os arquivos

Etapa 4

digite :bulkrename e pressione Enter

Etapa 5

Use uma macro Vim para gravar as alterações que você deseja fazer. Então, para o seu exemplo, se você começou na primeira linha do arquivo, você usaria estes comandos:

q a (isso inicia a macro com o nome "a")

0 , f. , de (move o cursor para o início da linha, localiza o primeiro "." e, em seguida, apaga para o último caractere antes do segundo "." antes do gif)

q (para parar de gravar a macro)

Etapa 6

Mova para a segunda linha e mova o cursor para o início da linha ( j , 0 ) e digite :2,$norm! @a

Isso executará a macro que você acabou de criar (chamada "a") da segunda linha até o final do arquivo.

Etapa 7

:wq para salvar e sair e, em seguida, :wq para confirmar as alterações.

Então, se tudo correr bem, você deve ter renomeado todos os seus arquivos. Se você não usou o Vim antes, eu recomendaria usar outra resposta para que você não precise aprender o Vim apenas para renomear arquivos. Eu prefiro usar o Vim, então este é o meu método de escolha quando renomeio em massa.

    
por RandomlyRainy 14.11.2017 / 18:31