Como renomear arquivos em massa com numeração mal formada?

3

Eu tenho muitos arquivos com numeração mal formada:

prefix-#.ext       | for files with number 1-9
prefix-##.ext      | for files with number 10-99
prefix-###.ext     | for files with number 100-999

Devido a um processamento posterior, preciso que todos os nomes deles estejam no formato: prefix-###.ext . Existe alguma maneira fácil de fazer isso?

    
por kravemir 13.03.2015 / 12:31

3 respostas

4

No Debian, Ubuntu e derivados, você pode usar o rename script Perl :

rename 's/(?<=-)([0-9]+)/sprintf "%03d", $1/e' prefix-*.ext

Alguns sistemas podem ter este comando instalado como prename ou perl-rename . Observe que este não é o utilitário rename do pacote util-linux, que não fornece uma maneira fácil de fazer isso.

No zsh, você pode usar zmv para renomear e l sinalizador de expansão de parâmetro para preencher com zeros.

autoload -U zmv
zmv '(prefix-)(*)(.ext)' '$1${(l:3::0:)2}$3'

Você também pode fazer isso com um loop de shell simples. Os shells não possuem boas construções de manipulação de strings; Uma maneira de preencher com zeros é adicionar 1000 e remover os 1 .

for x in prefix-*.ext; do
  n=${x%.ext}; n=${x##*-}; n=$((n+1000))
  mv "$x" "${x%-*.ext}${n#1}${x##*-}"
done

Outra maneira é chamar o utilitário printf .

for x in prefix-*.ext; do
  n=${x%.ext}; n=${x##*-}
  mv "$x" "${x%-*.ext}$(printf %03d "$n")${x##*-}"
done
    
por 14.03.2015 / 16:29
1

Talvez algo assim (não testado)

for n in *.ext; do
    echo mv "$n" \
      "prefix-$(printf %03d "$(basename ${n#prefix-} .ext)").ext"
done

Remova o echo para fazer a renomeação real.

Nota: você tem que estar no diretório onde os arquivos estão para este método funcionar; lidar com nomes de caminhos que contêm uma parte do diretório é mais complicado.

    
por 13.03.2015 / 12:43
1
for file in prefix-*.ext
do
    num='echo $file | sed 's/prefix-\(.*\).ext//''
    [ $num -lt 100 ] && mv $file prefix-'printf "%03d" ${num}'.ext
done
    
por 13.03.2015 / 13:14

Tags