Renomear em massa, alterar o prefixo

48

Como posso substituir o prefixo em massa para muitos arquivos?

Eu tenho muitos arquivos como

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Eu gostaria de mudar todos eles para

  • CLConnectionContext.h
  • CLConnectionContext.m

Como eu faria isso?

    
por ErikTJ 06.09.2012 / 18:14

7 respostas

36
for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

Isso usa a substituição do comando bash para remover os primeiros 6 caracteres do nome do arquivo de entrada via cut , pré-acrescenta CL ao resultado e armazena isso em $newname . Em seguida, ele renomeia o nome antigo para o novo nome. Isso é feito em todos os arquivos.

cut -c7- especifica que somente caracteres após o índice 7 devem ser retornados da entrada. 7- é um intervalo começando no índice 7 sem fim; isto é, até o final da linha.

Anteriormente, eu havia usado cut -b7- , mas -c deveria ser usado para manipular codificações de caracteres que poderiam ter vários bytes por caractere, como UTF-8.

    
por 06.09.2012 / 18:34
53

Eu diria que é mais simples usar apenas o comando rename , que é comum em muitas distribuições Linux. Existem duas versões comuns desse comando, portanto, verifique sua página de manual para descobrir qual delas você tem:

## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *

Se você quiser usar a versão do util-linux-ng em um sistema Debian, ela estará disponível sob o nome rename.ul

    
por 06.09.2012 / 18:48
28

Expansão do parâmetro Shell é suficiente para transformações simples como essa. A substituição de comando é menos eficiente devido à necessidade de gerar processos extras (para a própria substituição de comando e o cut / sed ).

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
    
por 06.09.2012 / 19:43
3

Aqui está uma maneira:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} - > Encontre todos os arquivos com a extensão .h ou .m
  • n=CL - > Adicione um prefixo CL ao nome do arquivo
  • sed -e 's/^Test//' - > Remove o prefixo de teste do nome do arquivo
  • mv $a $n - > Executa a renomeação
por 06.09.2012 / 18:39
2

Você pode tentar:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

Veja man bash (seção "Expansão de Parâmetros") para detalhes.

    
por 13.09.2012 / 12:33
1

Bem, não foi tão difícil quanto eu.

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;
    
por 06.09.2012 / 18:34
1

Se você precisar de algo mais perlish você pode fazer isso

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
    
por 06.09.2012 / 18:56