renomear múltiplos arquivos excluindo números aleatórios

0

Estou usando o Ubuntu e tenho muitos arquivos. Os arquivos têm dois tipos.

"img_00000_c0_1283347740957299us.jpg" 
"img_00000_c1_1283347740342342us.jpg"

Eles são distinguidos por c0 ou c1. Os números na posição '00000' aumentam à medida que o número do arquivo aumenta. Por exemplo, o tipo c0 e quinto arquivo teria o nome "img_ 00005 _c0_1283347740957299us.jpg". O problema é que os números longos depois de 'c0_' ou 'c1_' são insignificantes para mim e são números aleatórios. Eles nem sempre são '1283347740957299us'. Portanto, quero renomear esses arquivos apenas eliminando esses últimos números.

img_00005_c1_1283347740957299us.jpg ---> img_00005_c1.jpg

Eu tentei várias respostas na Internet. Por exemplo, uma resposta como

for FILE in eventDataLog.txt.2015*; do mv "$FILE" "abc-$FILE"; done

Acho que o código acima é de resposta me ajudaria, mas no meu caso, a renomeação não está adicionando caracteres. Também encontrei algumas respostas sobre a subtração de partes do nome em aqui , mas meu caso tem números aleatórios.

Obrigado antecipadamente!

    
por Minkyu Choi 27.12.2016 / 15:26

2 respostas

2

Algumas opções, basta remover o sufixo _ mais curto do final do nome:

  1. com o comando prename baseado em perl

    $ prename -nv -- 's/_[^_]*\.jpg/.jpg/' *.jpg
    img_00000_c0_1283347740957299us.jpg renamed as img_00000_c0.jpg
    img_00000_c1_1283347740342342us.jpg renamed as img_00000_c1.jpg
    

(remova a opção n quando estiver satisfeito com a saída)

  1. usando a expansão de parâmetros do shell

    $ for f in img_*.jpg; do echo mv -- "$f" "${f%_*}.jpg"; done
    mv -- img_00000_c0_1283347740957299us.jpg img_00000_c0.jpg
    mv -- img_00000_c1_1283347740342342us.jpg img_00000_c1.jpg
    

(remova o echo quando estiver satisfeito com a saída).

Se você quiser combinar o padrão mais especificamente (ou seja, como uma seqüência de um ou mais dígitos decimais, seguido por us ), então você pode fazer isso, mas não parece ser necessário com base nas informações que você tenho dado.

    
por 27.12.2016 / 15:44
0

Parece que há 16 dígitos antes da string us . Você pode usar rename para remover esses 18 caracteres no total, conforme mostrado abaixo.

rename -v 's/_(\d){16}us//' *.jpg
img_00000_c0_1283347740957299us.jpg renamed as img_00000_c0.jpg
img_00000_c1_1283347740342342us.jpg renamed as img_00000_c1.jpg
img_00005_c1_1283347740957299us.jpg renamed as img_00005_c1.jpg

A opção -v (verbose) mostra os nomes dos arquivos que são renomeados. O padrão (\d){16} indica um grupo de 16 dígitos. A saída mostrada acima é baseada em três arquivos de entrada de amostra. Você também pode ver mais exemplos de rename .

    
por 27.12.2016 / 15:55

Tags