Quero fazer uma iteração recursiva por meio de um diretório e alterar a extensão de todos os arquivos de uma certa extensão, digamos .t1
para .t2
. Qual é o comando bash para fazer isso?
Respostas:
115 para resposta № 1Se você tiver renomeado disponível, use:
find . -name "*.t1" -exec rename "s/.t1$/.t2/" "{}" ;
Se a renomeação não estiver disponível, use:
find . -name "*.t1" -exec bash -c "mv "$1" "${1%.t1}".t2" - "{}" ;
7 para resposta № 2
Se sua versão de bash
suporta o globstar
opção (versão 4 ou posterior):
shopt -s globstar
for f in **/*.t1; do
mv "$f" "${f%.t1}.t2"
done
5 para resposta № 3
Ou você pode simplesmente instalar o mmv
comando e fazer:
mmv "*.t1" "#1.t2"
Aqui #1
é a primeira parte glob, ou seja, a *
dentro *.t1
.
Ou em coisas puras, uma maneira simples seria:
for f in *.t1; do
mv "$f" "${i%.t1}.t2"
done
(por exemplo: for
pode listar arquivos sem a ajuda de um comando externo, como ls
ou find
)
HTH
2 para resposta № 4
Eu faria assim no bash:
for i in $(ls *.t1);
do
mv "$i" "${i%.t1}.t2"
done
EDITAR: meu erro: não é recursivo, aqui está o meu caminho para alterar o nome do arquivo recursivo:
for i in $(find `pwd` -name "*.t1");
do
mv "$i" "${i%.t1}.t2"
done