Se eu tiver um grupo de arquivos com uma extensão .htm, como posso renomear todos eles para .html?
mv *.htm *.html
não funciona.
Se eu tiver um grupo de arquivos com uma extensão .htm, como posso renomear todos eles para .html?
mv *.htm *.html
não funciona.
Respostas:
Ou você pode usar o bash puro ... (exceto para mv, isto é ..)
for file in *.htm; do mv "$file" "${file%.htm}.html"; done
e evite as coisas desagradáveis de nome de base. ;)
O Bash possui um amplo conjunto de opções de expansão variável. O usado aqui, '%', remove o menor sufixo correspondente do valor da variável. O padrão é um padrão glob, então ${file%.*}
também funcionaria. O operador '%%' remove o maior sufixo correspondente e é intercambiável no exemplo acima, pois o padrão é fixo, mas ${file%%.*}.html
transformaria abhtm em a.html.
Veja a seção de subestação variável da página de manual do bash para obter mais truques. Muito pode ser feito diretamente no bash.
Não deve haver espaços, novas linhas ou outros espaços em branco nos nomes de arquivos, mas esta versão da resposta do freiheit lida com eles. Ele também usa em $()
vez de backticks para facilitar a leitura, além de outros benefícios.
for file in *.htm
do
mv "$file" "$(basename "$file" .htm).html"
done
Ainda melhor - para o caso especial de apenas adicionar até o fim:
for file in *.htm
do
mv "$file" "${file}l"
done
rename(1)
é um utilitário Perl que faz exatamente o que você deseja. Nesse caso:
rename 's/\.htm$/.html/' *htm
ou se você estiver usando subdiretórios também
(requer Bash 4.0 e a configuração globstar: shopt -s globstar
)
rename 's/\.htm$/.html/' **/*htm
rename
vem com perl, e basicamente todo unix vem com perl atualmente.
shopt -s globstar
(desativada por padrão). Além disso, o Linux e o Unix têm diretórios em vez de pastas.
for file in *.htm; do
mv $file `basename "$file" .htm`.html
done
Experimente com um echo
na frente da mv
primeira vez.
O problema com o original é que " mv *.htm *.html
" tem os *
s manipulados pelo shell, portanto o mv
comando simplesmente vê uma lista de todos os arquivos .htm e .html no diretório atual. Em outras palavras, algo como " mv foo.htm bar.htm stuff.htm six.htm file.htm
". O mv sabe como lidar com mais de 2 argumentos se o último for um diretório.
mv
não funciona.
A melhor ferramenta é mmv .
mmv \*.htm #1.html
Outros exemplos de uso (e de outras ferramentas) no " Resumo das Ferramentas de Linha de Comando do GNU / Linux ".
#
.
O pacote util-linux-ng (no Fedora) possui um rename
comando semelhante ao mencionado pelo TRS-80 . Você pode usá-lo assim:
rename .htm .html *.html
ren *.htm *.html
funcionará no Windows.