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.


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'

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 *)


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'


-1

Uma maneira de fazer isso é:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh

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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.