Como posso substituir em massa o prefixo de 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?
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:Se você quiser usar a versão do util-linux-ng em um sistema Debian, ela estará disponível sob o nome
rename.ul
fonte
rename
existem na natureza. Verifique arename
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
).fonte
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}
-> 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çãofonte
Você pode tentar com:
Consulte
man bash
(seção "Expansão de parâmetros") para detalhes.fonte
Bem, não foi tão difícil quanto eu pensava.
fonte
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
fonte