Como posso renomear todos os arquivos com uma extensão para uma extensão diferente recursivamente [duplicado]

3

Digamos que eu tenha uma pasta:

/
/a.bub
/v.bub
/dr.bub
/catpictures
/catpictures/or.bub
/catpictures/on.bub

Como posso formatar um script para alterar cada um deles para .aaa .

Aqui está o que eu tenho, embora pareça uma abordagem errada:

find -type f -name "*.bub" -print0 -exec mv
    
por jett 10.06.2013 / 00:49

2 respostas

6

Você pode usar find e xargs :

$ find some_folder -type f -name "*.bub" | 
    sed "s/\.bub$//" | 
    xargs -I% mv -iv %.bub %.aaa
'some_folder/a.bub' -> 'some_folder/a.aaa'
'some_folder/v.bub' -> 'some_folder/v.aaa'
'some_folder/dr.bub' -> 'some_folder/dr.aaa'
'some_folder/catpictures/or.bub' -> 'some_folder/catpictures/or.aaa'
'some_folder/catpictures/on.bub' -> 'some_folder/catpictures/on.aaa'

... que você poderia generalizar para uma função bash:

$ extmv () {
    find "${1}" -type f -name "*.${2}" | 
    sed "s/\.${2}$//" | 
    xargs -I% mv -iv "%.${2}" "%.${3}"
}

... que você usaria assim:

$ extmv some_folder/ bub aaa
    
por 10.06.2013 / 01:29
11

O método mais simples é usar o bash:

for f in *.bub; do mv "$f" "${f/.bub/.aaa}"; done

Como muito corretamente apontado por @ZeroPiraeus e @HaukeLaging, isso não é recursivo. Você pode torná-lo recursivo ativando a opção globstar :

shopt -s globstar
for f in **/*.bub; do mv "$f" "${f/.bub/.aaa}"; done

Para versões mais antigas do bash, use find :

find -type f -name "*.bub" | while read f; do 
  mv "$f" "${f/.bub/.aaa}";
done
    
por 10.06.2013 / 01:14