Você pode usar o comando Renomear (consulte editar 1 ).
Solução 1
Para um número razoável de arquivos / diretório, definindo a opção 4 globstar (não funciona em nome recursivo, veja editar 3 ):
shopt -s globstar
rename -n 's/etckeeper/userkeeper/g' **
Solução 2
Para um grande número de arquivos / diretórios usando renomear e encontrar em duas etapas para evitar renomear arquivos com falha em apenas diretórios renomeados (veja editar 2 ):
find . -type f -exec rename 's/etckeeper/userkeeper/g' {} \;
find . -type d -exec rename 's/etckeeper/userkeeper/g' {} \;
EDIT 1:
Existem dois comandos diferentes de renomeação . Esta resposta usa o comando rename baseado em Perl, disponível em distribuições baseadas no Debian. Para tê-lo em uma distro não baseada em Debian, você pode instalar do cpan ou acessá-lo.
EDIT 2:
Como apontado por Jeff Schaller nos comentários, a opção -depth
find Process each directory's contents before the directory itself
, então apenas uma opção "ordenada" encontrada por -depth
seria suficiente:
find . -depth -exec rename 's/etckeeper/userkeeper/g' {} \;
EDIT 3
A solução 1 não funciona para alvos de renomeação recursiva, (es. etckeeper/etckeeper/etckeeper
) porque os níveis externos são processados antes que os níveis internos e ponteiro para níveis internos se tornem inúteis. (Depois que o primeiro renomear etckeeper/etckeeper/etckeeper
será nomeado usrkeeper/etckeeper/etckeeper
, a renomeação para etckeeper/etckeeper/
e etckeeper/etckeeper/etckeeper
falhará). O mesmo problema corrigido nas opções find
by -depth
.
EDIT4
Como apontado nos comentários por cas, eu usaria {} + em vez de {} \; - Forçar um script perl como renomear várias vezes (uma vez por arquivo / dir) é caro.