Renomeia um grupo de arquivos com um comando

37

Se eu tiver um grupo de arquivos com extensão .htm, como posso renomeá-los para .html?

mv *.htm *.html

não funciona.

    
por Richard Hoskins 19.07.2009 / 21:41

8 respostas

50

Ou você poderia 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 do nome de base. ;)

O Bash tem um extenso 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, ${file%%.*}.html transformaria a.b.htm em a.html.

Veja a seção de substituições de variáveis na manpage bash para mais truques. Há muita coisa que pode ser feita diretamente no bash.

    
por 19.07.2009 / 22:17
11

Não deve haver espaços, novas linhas ou outros espaços em branco nos nomes dos arquivos, mas essa versão da resposta do freiheit lida com isso. Ele também usa $() em vez de backticks para facilitar a leitura junto com outros benefícios.

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

Ainda melhor - para o caso especial de apenas adicionar ao final:

for file in *.htm
do
    mv "$file" "${file}l"
done
    
por 19.07.2009 / 22:03
11

rename(1) é um utilitário Perl que faz exatamente o que você deseja. Neste caso:

rename 's/\.htm$/.html/' *htm

ou se você estiver usando sub-diretórios também

(requer Bash 4.0 e a configuração globstar: shopt -s globstar )

rename 's/\.htm$/.html/' **/*htm

    
por 19.07.2009 / 21:51
6
for file in *.htm; do
  mv $file 'basename "$file" .htm'.html
done

Experimente com echo na frente da mv na primeira vez.

O problema com o original é que " mv *.htm *.html " tem o * s manipulado pelo shell, portanto, o comando mv 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 ". mv só sabe como lidar com mais de 2 argumentos se o último for um diretório.

    
por 19.07.2009 / 21:44
3

No entanto, outro exemplo puro de bash usando string replace.

for file in *.htm; do mv $file ${file/htm/html}; done

Extra - isso substitui todas as ocorrências de uma string

for file in *.htm; do mv $file ${file//htm/html}; done
    
por 10.07.2011 / 06:53
1

Se você usar Zsh , você pode usar 'zmv'

    
por 19.07.2009 / 22:22
1

A melhor ferramenta é mmv .

mmv \*.htm #1.html

Outros exemplos de uso (e de outras ferramentas) em " GNU / Linux Resumo das ferramentas de linha de comando ".

    
por 20.07.2009 / 15:46
0

O pacote util-linux-ng (no Fedora) tem um comando rename semelhante ao mencionado por TRS-80 . Você pode usá-lo assim:

rename .htm .html *.html
    
por 12.09.2009 / 23:38

Tags