Copie / renomeie vários arquivos usando expressão regular (shell script)

8

Eu tenho uma coleção de arquivos que correspondem a um padrão como 'assignment02.cc', 'assignment02.h', 'assignment02.txt', etc. Eu gostaria de copiar / renomear esses arquivos para 'assignment03.cc', 'assignment03.h', 'assignment03.txt' e assim por diante.

Eu suspeito que isso deve ser direto usando um script de shell e sed. Até agora eu tenho:

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/xx$NEW_NO/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

Infelizmente, a maneira como estou chamando sed sempre retorna a string de entrada $name e, na verdade, não faz a regex encontrar / substituir.

Nota: Ao procurar na internet, existe um comando rename com essa funcionalidade, mas que não está disponível no meu MacBook.

    
por Gilles 09.02.2011 / 20:03

4 respostas

5

Usar sed aqui apresenta mais complexidade do que vale a pena. Use os recursos internos de manipulação de texto do shell. Por exemplo, ${name#assignment02} retira o prefixo assignment02 de $name .

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

As aspas duplas não são necessárias se você tiver certeza de que os nomes dos arquivos não contêm caracteres especiais do shell.

Se você tiver zsh disponível, sua função zmv é útil para esses tipos de renomeação.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'
    
por 09.02.2011 / 23:32
2

Você já está pensando muito complexo

rename 02 03 *02*

'renomear' substitui o primeiro arg ('02') pelo segundo arg ('03') no nome de todos os arquivos fornecidos no arg3 ou após (* 02 *)

    
por 10.02.2011 / 01:06
0

Uma abordagem diferente:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

A longo prazo: tente "renomear"

    
por 10.02.2011 / 09:47
-1

Uma maneira de fazer isso é:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '.txt'/" | sh
    
por 09.02.2011 / 20:27