Como faço para renomear a extensão para um monte de arquivos?
-
22-07-2019 - |
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.
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 ...
- Instale renomeação se você não tiver:
brew install rename
-
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 ??strong> 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 é 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 ??p>
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$