Respostas:
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 6 primeiros caracteres do nome do arquivo de entrada via cut, precede CLo resultado e armazena-o $newname. Em seguida, renomeia o nome antigo para o novo nome. Isso é realizado em todos os arquivos.
cut -c7-especifica que somente caracteres após o índice 7 devem ser retornados da entrada. 7-é um intervalo que começa no índice 7 sem fim; isto é, até o final da linha.
Anteriormente, eu tinha usado cut -b7-, mas -cdeveria ser usado para lidar com codificações de caracteres que poderiam ter vários bytes por caractere, como UTF-8.
Eu diria que o mais simples é usar apenas o renamecomando que é comum em muitas distribuições Linux. Existem duas versões comuns desse comando, portanto, verifique sua página de manual para descobrir qual você possui:
## 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
renameexistem na natureza. Verifique a renamedocumentação local para descobrir como usar a sua.
rename TestSR '' *
rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
A expansão dos parâmetros do shell é suficiente para transformações simples como essa. A substituição de comandos é menos eficiente devido à necessidade de gerar processos extras (para a própria substituição de comandos e o cut/ sed).
for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
TestSR*localiza os arquivos, CL${f#TestSR}será o novo nome. O material após o #será substituído pelo nome do arquivo ( f).
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 extensão .h ou .mn=CL -> Adicione um prefixo CL ao nome do arquivosed -e 's/^Test//' -> Remove o prefixo Teste do nome do arquivomv $a $n -> Executa a renomeaçãoVocê pode tentar com:
for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done
Consulte man bash(seção "Expansão de parâmetros") para detalhes.
Bem, não foi tão difícil quanto eu pensava.
$ 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;
for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
Se você precisar de algo mais pernicioso, pode fazer isso
perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *