Script para renomear arquivos

1

Agradeço antecipadamente qualquer ajuda. Eu escrevi um script para renomear todos os arquivos .BMP, e parece funcionar, mas recebo o seguinte erro / mensagem para cada arquivo:

IM2019.BMP
mv: cannot stat 'IM2000.BMP': No such file or directory
mv: cannot stat 'IM2001.BMP': No such file or directory
mv: cannot stat 'IM2002.BMP': No such file or directory
mv: cannot stat 'IM2003.BMP': No such file or directory
mv: cannot stat 'IM2004.BMP': No such file or directory
mv: cannot stat 'IM2005.BMP': No such file or directory
mv: cannot stat 'IM2006.BMP': No such file or directory
mv: cannot stat 'IM2007.BMP': No such file or directory
mv: cannot stat 'IM2008.BMP': No such file or directory
mv: cannot stat 'IM2009.BMP': No such file or directory
mv: cannot stat 'IM2010.BMP': No such file or directory
mv: cannot stat 'IM2011.BMP': No such file or directory
mv: cannot stat 'IM2012.BMP': No such file or directory
mv: cannot stat 'IM2013.BMP': No such file or directory
mv: cannot stat 'IM2014.BMP': No such file or directory
mv: cannot stat 'IM2015.BMP': No such file or directory
mv: cannot stat 'IM2016.BMP': No such file or directory
mv: cannot stat 'IM2017.BMP': No such file or directory
mv: cannot stat 'IM2018.BMP': No such file or directory
mv: cannot stat 'IM2019.BMP': No such file or directory

Eu tenho os seguintes arquivos no diretório:

hristo@HassanGrad27:~/Desktop/Test$ ls
IM0000.BMP  IM0011.BMP  IM1002.BMP  IM1013.BMP  IM2004.BMP  IM2015.BMP
IM0001.BMP  IM0012.BMP  IM1003.BMP  IM1014.BMP  IM2005.BMP  IM2016.BMP
IM0002.BMP  IM0013.BMP  IM1004.BMP  IM1015.BMP  IM2006.BMP  IM2017.BMP
IM0003.BMP  IM0014.BMP  IM1005.BMP  IM1016.BMP  IM2007.BMP  IM2018.BMP
IM0004.BMP  IM0015.BMP  IM1006.BMP  IM1017.BMP  IM2008.BMP  IM2019.BMP
IM0005.BMP  IM0016.BMP  IM1007.BMP  IM1018.BMP  IM2009.BMP  rename
IM0006.BMP  IM0017.BMP  IM1008.BMP  IM1019.BMP  IM2010.BMP  rename~
IM0007.BMP  IM0018.BMP  IM1009.BMP  IM2000.BMP  IM2011.BMP  stringtest
IM0008.BMP  IM0019.BMP  IM1010.BMP  IM2001.BMP  IM2012.BMP  stringtest~
IM0009.BMP  IM1000.BMP  IM1011.BMP  IM2002.BMP  IM2013.BMP
IM0010.BMP  IM1001.BMP  IM1012.BMP  IM2003.BMP  IM2014.BMP

e posso fazer com que meus arquivos sejam renomeados como:

hristo@HassanGrad27:~/Desktop/Test$ ls
cam1-0.BMP   cam1-3.BMP   cam2-15.BMP  cam2-9.BMP   cam3-2.BMP
cam1-10.BMP  cam1-4.BMP   cam2-16.BMP  cam3-0.BMP   cam3-3.BMP
cam1-11.BMP  cam1-5.BMP   cam2-17.BMP  cam3-10.BMP  cam3-4.BMP
cam1-12.BMP  cam1-6.BMP   cam2-18.BMP  cam3-11.BMP  cam3-5.BMP
cam1-13.BMP  cam1-7.BMP   cam2-19.BMP  cam3-12.BMP  cam3-6.BMP
cam1-14.BMP  cam1-8.BMP   cam2-1.BMP   cam3-13.BMP  cam3-7.BMP
cam1-15.BMP  cam1-9.BMP   cam2-2.BMP   cam3-14.BMP  cam3-8.BMP
cam1-16.BMP  cam2-0.BMP   cam2-3.BMP   cam3-15.BMP  cam3-9.BMP
cam1-17.BMP  cam2-10.BMP  cam2-4.BMP   cam3-16.BMP  rename
cam1-18.BMP  cam2-11.BMP  cam2-5.BMP   cam3-17.BMP  rename~
cam1-19.BMP  cam2-12.BMP  cam2-6.BMP   cam3-18.BMP  stringtest
cam1-1.BMP   cam2-13.BMP  cam2-7.BMP   cam3-19.BMP  stringtest~
cam1-2.BMP   cam2-14.BMP  cam2-8.BMP   cam3-1.BMP

Este é o script:

#!/bin/bash

# Specify directory
for i in $(ls *.BMP) 
    do str="$i"
    echo $str
    charim=${str:2:1}
    #echo $charim

    if [ "$charim" -eq 0 ] && [ "$charim" -ne 1 ] && [ "$charim" -ne 2 ];       then
        #echo "1"
        for j in {0..9}
        do mv IM000$j.BMP cam1-$j.BMP
        done
        for j in {10..19}
        do mv IM00$j.BMP cam1-$j.BMP
        done
    fi 

    if [ "$charim" -ne 0 ] && [ "$charim" -eq 1 ] && [ "$charim" -ne 2 ];       then
    #echo "2"
        for j in {0..9}
        do mv IM100$j.BMP cam2-$j.BMP
        done
        for j in {10..19}
        do mv IM10$j.BMP cam2-$j.BMP
        done
    fi

    if [ "$charim" -ne 0 ] && [ "$charim" -ne 1 ] && [ "$charim" -eq 2 ];       then
    #echo "3"
        for j in {0..9}
        do mv IM200$j.BMP cam3-$j.BMP
        done
        for j in {10..19}
        do mv IM20$j.BMP cam3-$j.BMP
        done
    fi

done

O que causa o erro / aviso?

Muito obrigado

    
por hristog 21.02.2014 / 23:27

1 resposta

3

for f in IM*.BMP; do
    n1=${f:2:1}
    n2=${f:3:3}
    new="cam$(( n1 + 1 ))-$(( 10#$n2 )).BMP"
    echo mv "$f" "$new"
done

$(( ... )) é uma expansão aritmética. O 10#$n2 força o conteúdo da variável n2 a ser tratada como um número base-10, e os zeros à esquerda são descartados: você não pode usar $(( n2 + 0 )) porque você teria um erro "octal inválido" para n2 == 008 O $ é opcional dentro de uma expressão aritmética, a menos que você use a notação base #

    
por glenn jackman 21.02.2014 / 23:57