Renomeia todos os arquivos com uma extensão específica em todo o subdiretório [duplicado]

1

Eu tenho muitos diretórios. Cada um deles tem um arquivo com uma extensão específica .ext .

Eu quero renomear esses arquivos.

Exemplo:

// Note: The names are random, can have spaces and special characters

Parent
 |
 |- First Directory
 |   |
 |   |- Some file.txt
 |   |- Another one.pdf
 |   '- The one to rename.ext
 |
 |- Second Directory
 |   |
 |   |- Some file.txt
 |   |- Another one.pdf
 |   '- The one to rename.ext
[…]

Desejo renomear todo o arquivo com a extensão .ext para new name.ext2 . Existe apenas um arquivo com o .ext por diretório, então não há problema com isso.

O que eu fiz até agora é:

find ./Parent -name "*.ext" -exec mv "{}" "{}.ext2" \;

E eu recebo um monte de The one to rename.ext.ext2 , estou empenhado em renomeá-los new name.ext2 . Se eu apenas configurá-lo como o segundo argumento de mv , ele os moverá para o diretório Parent e, assim, cada chamada para a função mv sobrescreverá o arquivo movido anteriormente.

Observação: não consegui fazer isso funcionar usando o argumento -exec bash -c '' . Eu tentei algo ao longo das linhas de:

find ./Parent -name "*.ext" -exec bash -c 'mv {} "$(dirname {})/new name.ext2"' \;

Mas tenho um problema com o $() sendo expandido antes de {}

    
por JoliG 28.04.2016 / 07:44

2 respostas

1

Você pode usar a função -printf de find para construir seus comandos:

find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext"
mv /tmp/foo.ext /tmp/new_name.ext

Quando você colocar o comando com $() , os comandos serão executados:

$(find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext")
find /tmp -name "*.ext"
/tmp/new_name.ext

Atualização:

O comando acima não funciona corretamente em vários arquivos e não usa valores de aspas. Use o comando abaixo:

find /tmp -name \*.ext\*
/tmp/dir with space/bar.ext
/tmp/foo.ext

bash -x < <(find /tmp -name "*.ext" -printf "mv \"%p\" \"%h/new_name.ext2\"\n")
+ mv '/tmp/dir with space/bar.ext' '/tmp/dir with space/new_name.ext2'
+ mv /tmp/foo.ext /tmp/new_name.ext2

find /tmp -name \*.ext\*
/tmp/dir with space/new_name.ext2
/tmp/new_name.ext2
    
por 28.04.2016 / 08:59
0

Use sed

for file in */*.ext; do
    ext2='echo $file | sed 's/.ext/.ext2/''
    mv $file $ext2
done
    
por 28.04.2016 / 09:08