Renomeie arquivos no script bash

2

Estou escrevendo um script para renomear meus arquivos. A sintaxe atual do nome do arquivo é program 1.c e quero alterar isso para cprogram-program1.c .

Não consigo obter este formato. Poucas condições para simplicidade são:

  • suponha que existam apenas 10 arquivos, por exemplo: 0,1,2,3..9

Meu procedimento para conseguir isso:

  • Primeiro, precisamos filtrar os arquivos para descobrir os arquivos que seguem o padrão fornecido

  • Em seguida, precisamos filtrar o nome do arquivo para substrings ignorer para verificar se eles estão em um formato adequado

  • Se eles estiverem em um formato adequado, podemos editar o nome do arquivo da maneira que precisamos.

Estou preso nos passos 1 e 2, é o que estou fazendo:

for fn in *; do --> this loops over the files 
 program=${fn:0:7}
 number=${..} --> number between 0 and 9
 extension=${..} --> gets file extension like .c

if [ "$program" == "program"  ]
 then
    if [ "$number" -ge 0 ] && [ "$number" -le 9 ]
     then

         if [ "$extension" == ".c" ]
          then
            --> edit code 
          fi

     fi
fi
done

Meu problema: tentei muitas permutações do exemplo acima, mas não consigo obter o que quero. Qualquer ajuda, método simples de fazer isso seria muito apreciado.

Obrigado

    
por Mathew 01.10.2015 / 04:49

2 respostas

1
for fn in *
do  case $fn in
    (program*[1-8].c)
        : do something;;
    (other*program*[09].ext)
        : do something with this match;;
    (this*match|*or*|*any*"$of"*these*matches)
        : do something with these matches
        : do as many lines as you want;;
    (*) : catch all last default match
    esac
done

Uma técnica comumente usada em case instruções é remover correspondências indesejadas com padrões mais específicos do que o padrão geralmente desejado. Por exemplo:

for fn in *
do  case $fn in
    (*[0-9][0-9].c) ;;
    (program*[1-8].c)
        echo mv "$fn" "${fn%???}0${fn#"${fn%???}"}"
    esac
done

No exemplo acima, o primeiro padrão *[0-9][0-9].c corresponde a todos os valores $fn , em que dois ou mais dígitos podem ocorrer à esquerda da extensão. O bloco de execução para essas correspondências está vazio - null - nada acontece quando uma correspondência é encontrada. O mais importante, no entanto, porque as instruções case funcionam de cima para baixo, o que isso significa é que os únicos resultados já correspondidos para o bloco de ação conterão apenas um dígito à esquerda da extensão e o comando echo do exemplo um 0 antes de todos e cada um daqueles que ocorrem entre 1 e 8.

    
por 01.10.2015 / 05:02
0

Como alternativa, dispense o script e use uma ferramenta rename .

Frustrantemente, há (pelo menos) duas instâncias diferentes de rename dependendo da sua distribuição. Em alguns sistemas, a versão Perl pode ser chamada de prename . No entanto, você pode dizer qual deles está executando rename -n ';' /dev/null . Se nada acontecer você tem a versão Perl. Se você receber um erro, é o outro.

The current syntax for filename is program 1.c and I want to change this to cprogram-program1.c. Assume that there are only 9 files i.e: 0,1,2,3..9

  1. O rename ( prename )

    baseado em Perl
    rename 's/^/cprogram-/; s/\s//' program\ ?.c
    
  2. O outro rename

    rename -v 'program ' cprogram-program program\ ?.c
    
por 01.10.2015 / 10:10