Como renomear todos os arquivos e diretórios na pasta atual?

4

Eu tenho uma estrutura de diretórios como esta:

./
  whatever/
    foos_whatever.ext
  something/
    foo/
      1.ext
      2.ext
  another/
    foo.ext

Desejo renomear todos os diretórios de arquivos e que contenham foo . Eu gostaria de substituir foo por bar .

Aqui está o que estou tentando:

[naomi ~/app]$ find . -name '*foo*' -exec f={} && mv -v f ${f/foo/bar} \;

Este é o erro que estou recebendo:

find: -exec: no terminating ";" or "+"

Obrigado por qualquer ajuda: D

    
por user633183 17.05.2011 / 21:42

2 respostas

2

A maneira mais óbvia que eu acho que você é:

find -name "*foo*" -exec rename s/foo/bar/ {} \;

ou com xargs, se você tiver muitos arquivos para renomear:

find -name "*foo*" | xargs -I '{}' rename s/foo/bar/ '{}'

No entanto, o problema com isso é se você tem uma estrutura de diretório parecida com esta:

.
|-- fooDir
|   |-- foo.txt
|   '-- abc
'-- foo2

Ele falhará ao renomear foo.txt, porque ele primeiro renomeará fooDir em barDir e, em seguida, declarará que ele não encontra mais "fooDir / foo.txt"

Simplesmente re-executando o comando até que você não tenha nenhum erro, mas é desleixado. Outra maneira seria executar o comando em um loop, uma vez para cada nível de profundidade da árvore de diretórios, com as opções find options -mindepth e -maxdepth definidas para excluir outros níveis, mas você precisa saber a profundidade do seu sistema de diretórios.

Não consigo pensar em uma maneira melhor.

    
por 18.05.2011 / 08:40
2

Você não pode usar cadeias de comandos como essa em -exec , já que o shell as interpreta como sendo continuações de find em si. Execute a cadeia em um subshell ou use rename ou prename para renomear o arquivo.

    
por 17.05.2011 / 21:45