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 CL
o 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 -c
deveria 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 rename
comando 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
rename
existem na natureza. Verifique a rename
documentaçã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/) }' *