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. etc. Gostaria de copiar / renomear esses arquivos em '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\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

Infelizmente, a maneira como estou invocando o sed sempre retorna a string de entrada $namee, na verdade, não faz com que o regex encontre / substitua.

Nota: Procurando na Internet, existe um renamecomando que possui essa funcionalidade, mas que não está disponível no meu MacBook.

Gilles 'SO- parar de ser mau'
fonte
Altere as aspas simples para aspas duplas. Se você tem aspas simples em torno do comando sed, em seguida, $OLD_NOe $NEW_NOnão vai ficar expandida.
Mikel
newname=$(echo $name | tr $OLD_NO $NEW_NO)
Nizam Mohamed

Respostas:

5

Usar o 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 assignment02de $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 o zsh disponível, sua zmvfunção será útil para esses tipos de renomeação.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'
Gilles 'SO- parar de ser mau'
fonte
3

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 depois (* 02 *)

Patrick
fonte
O renamecomando com esta sintaxe é um utilitário Linux, não disponível no OSX (e nem disponível por esse nome na maioria das instalações Debian e Ubuntu).
Gilles 'SO- stop be evil'
Ah, não sabia que você estava no OSX, chatice
Patrick
Rename é um script perl, por isso provavelmente será executado no OS X. encontrou aqui usando google: tips.webdesign10.com/files/rename.pl.txt
azzid
0

Uma abordagem diferente:

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

A longo prazo: tente obter 'renomear'

Usuário desconhecido
fonte
-1

Uma maneira de fazer isso é:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh
mazianni
fonte
2
Não analise a saída dels . E gerar um script de shell é uma maneira de dar um tiro na cabeça. A pergunta de Vault Boy contém uma abordagem razoável do lado da concha, faltando apenas o encantamento sed e algumas citações.
Gilles 'SO- stop be evil'