Renomear recursivamente arquivos (alterar extensão) no Linux

18

Como renomeio todos os arquivos em um diretório, recursivamente, alterando uma extensão de arquivo para outra, para milhares de arquivos em milhares de subpastas? Eu vejo muitos comandos que fazem quase o que eu quero, mas não exatamente.

find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."

...

rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile
    
por endolith 20.11.2010 / 17:38

4 respostas

18

Descobri isso

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
./0/0.png.andnav renamed as ./0/0.png.tile
./0/1.png.andnav renamed as ./0/1.png.tile
./1/0.png.andnav renamed as ./1/0.png.tile
./1/1.png.andnav renamed as ./1/1.png.tile

claro, remova o -v quando estiver fazendo, ou perderá tempo exibindo todos os arquivos

    
por 20.11.2010 / 17:56
12

Algo como:

find . -name '*.andnav' -exec sh -c 'mv "$0" "${0%.andnav}.tile"' {} \;
    
por 20.11.2010 / 17:53
12

Com zsh:

autoload zmv
zmv -n '(**/)(*).andnav' '$1$2.tile'

Remova o -n para realmente realizar a renomeação.

    
por 21.11.2010 / 00:45
3

Eu achei este método mais fácil e mais fácil de ler:

find . -name "*.andnav" | rename "s/\.andnav$/.tile/"

Pelo menos nas derivações do Ubuntu renomear leva uma lista de arquivos de STDIN se nenhum estiver na linha de comando. E isso pode ser testado facilmente com:

find . -name "*.andnav" | rename -vn "s/\.andnav$/.tile/"

até você acertar.

    
por 19.02.2016 / 06:06