it-swarm-pt.tech

Renomeie um grupo de arquivos com um comando

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.

38
Richard Hoskins

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, ${file%%.*}.html transformaria a.b.htm 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.

50
falstro

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

11
TRS-80

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 ao final:

for file in *.htm
do
    mv "$file" "${file}l"
done
11
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

Experimente com um echo na frente de mv pela primeira vez.

O problema com o seu original é que "mv *.htm *.html" tem o *s são manipulados 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 lidar com mais de 2 argumentos se o último for um diretório.

6
freiheit

Ainda outro exemplo puro de bash usando string replace.

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

Extra - substitui todas as ocorrências de uma sequência

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

Se você usar Zsh , poderá usar 'zmv'

1
Martin

A melhor ferramenta é mmv .

mmv \*.htm #1.html

Outros exemplos de uso (e de outras ferramentas) em " Resumo das Ferramentas de Linha de Comando do GNU/Linux ".

1
bortzmeyer

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

rename .htm .html *.html
0
Cristian Ciupitu