Pergunta

Em um diretório, eu tenho um monte de arquivos *.html. Eu gostaria de mudar o nome de todos eles para *.txt

Como posso fazer isso? Eu uso o shell bash.

Foi útil?

Solução

Para uma melhor solução (com apenas funcionalidade festa, em oposição às chamadas externas), ver das outras respostas .


A seguir faria e não requer o sistema para que o programa rename (embora quem mais frequentemente têm isso em um sistema):

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

EDIT: Como apontado nos comentários, isso não funciona para nomes de arquivos com espaços entre eles sem a devida citação (agora acrescentada acima). Ao trabalhar puramente em seus próprios arquivos que você sabe que não tem espaços nos nomes de arquivos isso vai funcionar, mas sempre que você escrever algo que pode ser reutilizado em um momento posterior, não pule citando adequada.

Outras dicas

Se estiver usando bash, não há nenhuma necessidade de comandos externos como o sed, basename, renomeação, expr, etc.

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done
rename 's/\.html$/\.txt/' *.html

faz exatamente o que você quer.

Isso funcionou para mim no OSX de .txt para .txt_bak

find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;

Você quer usar rename :

rename -S .html .txt *.html

Este faz exatamente o que você quer -. Ele vai mudar a extensão de .html para .txt para todos os arquivos *.html harmonização

Nota: Greg Hewgill corretamente aponta isso não é uma festa embutido; e é um comando separado Linux. Se você só precisa de algo no Linux isso deve funcionar bem; se você precisa de algo mais multi-plataforma, em seguida, dar uma olhada em uma das outras respostas.

Em um Mac ...

  1. Instale renomeação se você não tiver: brew install rename
  2. rename -S .html .txt *.html

Para usuários do Ubuntu:

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

Aqui está um exemplo do comando de mudança de nome:

rename -n ’s/\.htm$/\.html/’ *.htm

Os meios -n que é um teste e não vai realmente mudar quaisquer arquivos. Ela vai mostrar uma lista de arquivos que seriam renomeados se você removeu o -n. No caso acima, ele irá converter todos os arquivos no diretório atual de uma extensão .htm arquivo para .html.

Se a saída do teste acima parecia ok, então você pode executar a versão final:

rename -v ’s/\.htm$/\.html/’ *.htm

O -v é opcional, mas é uma boa idéia para incluí-lo porque é o único registro você terá de alterações que foram feitas pelo comando de mudança de nome, como mostrado no exemplo de saída abaixo:

$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html

A parte complicada no meio é uma substituição Perl com expressões regulares, destacadas abaixo:

rename -v ’s/\.htm$/\.html/’ *.htm

Depois de outra pessoa crawl website, acabei com milhares de arquivos ausentes a extensão .html, através de uma grande árvore de subdiretórios.

Para mudar o nome-los todos em um único tiro, exceto os arquivos já ter uma extensão .html (a maioria deles tinha nenhum), isso funcionou para mim:

cd wwwroot
find . -xtype f \! -iname *.html   -exec mv -iv "{}"  "{}.html"  \;  # batch rename files to append .html suffix IF MISSING

No caso do OP eu poderia modificar que ligeiramente, para renomear única arquivos .txt *, assim:

find . -xtype f  -iname *.txt   -exec filename="{}"  mv -iv ${filename%.*}.{txt,html}  \; 

Dividido (hammertime!):

-iname * .txt
- Meios considerar apenas já arquivos que terminam em .txt

mv -iv "{}. {Txt, html}" - Quando encontrar passa a {} como o nome do arquivo, $ {filename% *.} Extrai seu nome base sem qualquer extensão para formar os parâmetros para mv . festa leva o {txt, html} para reescrevê-lo como dois parâmetros para as finais corridas de comando como: mv -iv "filename.txt" "filename.html"

Fix necessário embora: lidar com espaços em nomes de arquivos

Esta questão menciona explicitamente Bash, mas se acontecer de você ter ZSH disponível é bastante simples:

zmv '(*).*' '$1.txt'

Se você receber zsh: command not found: zmv seguida, basta executar:

autoload -U zmv

E, em seguida, tente novamente.

Graças a este artigo original para a ponta sobre zmv.

Esta é a solução mais liso que eu encontrei que funciona em OSX e Linux, e ele funciona muito bem com git também!

find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;

e com git:

find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;

O mmv comando parece fazer esta tarefa de forma muito eficiente em um grande número de arquivos ( dezenas de milhares em um segundo). Por exemplo, para renomear todos os arquivos .xml para arquivos .html, use o seguinte:

mmv ";*.xml" "#1#2.html"

o ; vai coincidir com o caminho, a * irá coincidir com o nome do arquivo, e estes são referidos como #1 e #2 em nome substituto.

As respostas baseadas em exec ou tubos eram ou muito lento ou não em um número muito grande de arquivos.

Tente este

rename .html .txt *.html 

uso:

rename [find] [replace_with] [criteria]

Um pouco atrasado para a festa. Você poderia fazê-lo com xargs:

ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}

Ou se todos os seus arquivos estão em alguma pasta

ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}

Se você preferir PERL, há um roteiro curto PERL (orignally escrito por Larry Wall, criador do Perl) que vai fazer exatamente o que você quer aqui: tips.webdesign10.com/files/rename.pl.txt . Para o seu exemplo a seguir deve fazer o truque

rename.pl 's/html/txt/' *.html

=)

(Graças @loretoparisi para o URL atualizado)

Infelizmente não é trivial para fazer portably. Você provavelmente precisará de um pouco de magia expr.

for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done

Remova o eco uma vez que você está feliz que faz o que quiser.

Editar:. basename é provavelmente um pouco mais legível para este caso particular, embora expr é mais flexível em geral

Esta é uma boa maneira de modificar várias extensões ao mesmo tempo:

for fname in *.{mp4,avi}
do
   mv -v "$fname" "${fname%.???}.mkv"
done

Nota: ter cuidado com o tamanho de extensão a ser o mesmo (o ???)

Nice & simples!

find . -iname *.html  -exec mv {} "$(basename {} .html).text"  \;

Aqui está o que eu usei para renomear arquivos .edge para .blade.php

for file in *.edge; do     mv "$file" "$(basename "$file" .edge).blade.php"; done

Funciona como charme.

Uma linha, sem loops: ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}

cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json  ac8453e2-0d82-4d43-b80e-205edb754700.json
cbongiorno@ip-172-31-26-242:~/pgsql$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt  ac8453e2-0d82-4d43-b80e-205edb754700.txt
cbongiorno@ip-172-31-26-242:~/pgsql$ 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top