renomeação em massa de arquivos que não estão funcionando

1

Uma pergunta semelhante está sendo feita. O erro provavelmente está me encarando, mas eu não consigo ver ...

#!/bin/bash
declare -a files
shopt -s nullglob       
files=(*)
count=36   # offset

for oldfilename in "${files[@]}"; do
    (( count++ ))
#   newfilename=$(echo "$oldfilename" | sed -e "s/^[1-9][0-9]?\.jpg/Scount\.png/")
#   newfilename=${oldfilename/[1-9][0-9]?/Scount}
#   newfilename=${oldfilename/[1-9][0-9]?/"Scount"}
    newfilename=${oldfilename//[1-9][0-9]?/Scount}
    echo mv -fv /path1/to/"${oldfilename}" /path2/to/"${newfilename}"
done
exit 0

Eu tentei linhas comentadas. Não sei a diferença entre / e // in newfilename=${oldfilename/[1-9][0-9]?/"Scount"} . o_0

EDITAR: Os arquivos representados por $oldfilename têm o formato 1.jpg to 99.jpg . Espera-se que os arquivos de saída $newfilename tenham o formato 37.png a 135.png (pelo menos no que se refere à invocação de sed ).
De alguma forma, os arquivos não são renomeados e o ponto em .jpg desaparece. Por que isso não funciona?

    
por Cbhihe 07.01.2016 / 23:08

2 respostas

2

Eu acho que do seu (comentado) comando sed que você quer para corresponder e substituir uma expressão regular: [1-9][0-9]? , meaning

  • um dígito diferente de zero ( [1-9] ), seguido por
  • zero ou um dígito (s) ( [0-9]? )

que é um regex razoavelmente comum para um inteiro entre 1 e 99 (sem nenhum zero inicial). No entanto, ${parameter/pattern/string} não usa regexs, ele usa padrões de expansão de nome de caminho (a.k.a. wildcards). Então [1-9][0-9]? significa

  • um dígito diferente de zero ( [1-9] ), seguido por
  • um dígito ( [0-9] ), seguido por
  • qualquer caractere ( ? )

Ainda assim, deveria ter funcionado para os nomes de dois dígitos, embora consuma o . e renomeie o 10.jpg para 46jpg (sem . ).

Em relação à outra parte da sua pergunta, // substitui todas as ocorrências do padrão , enquanto / substitui apenas o primeiro. Por exemplo,

$ i=cataract
$ echo "${i/a/X}"
cXtaract
$ echo "${i//a/X}"
cXtXrXct
    
por 08.01.2016 / 02:09
1

Se você tem o Perl rename (às vezes chamado de prename ), você pode fazer isso:

rename -v 's!(\d+)(.*)\.jpg$!sprintf "%d%s.png", $1+36, $2!e' *.jpg

Isso leva cada nome de arquivo, divide os dígitos iniciais, o restante do componente de nome de arquivo e o .jpg à direita. Em seguida, ele adiciona 36 à parte numérica, adiciona o restante do nome do arquivo original e substitui o sufixo por .png .

Use rename -n ... para ver o que aconteceria com a alteração de qualquer coisa ou remova o -v para que ele seja executado silenciosamente.

    
por 08.01.2016 / 13:07

Tags