Em um diretório, tenho vários *.html
arquivos. Eu gostaria de renomear todos eles para*.txt
Como eu posso fazer isso? Eu uso o shell bash.
fonte
Em um diretório, tenho vários *.html
arquivos. Eu gostaria de renomear todos eles para*.txt
Como eu posso fazer isso? Eu uso o shell bash.
Para uma solução melhor (apenas com funcionalidade bash, em oposição a chamadas externas), consulte uma das outras respostas .
O seguinte requer e não exige que o sistema possua o rename
programa (embora você o possua com mais freqüência 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 neles sem uma citação adequada (agora adicionada acima). Ao trabalhar exclusivamente em seus próprios arquivos que você sabe que não têm espaços nos nomes dos arquivos, isso funcionará, mas sempre que você escrever algo que possa ser reutilizado posteriormente, não pule a citação adequada.
ren *.a *.b
$()
sintaxe especificada pelo POSIX em vez da sintaxe do backtick herdado. Melhora a legibilidade e torna a sintaxe muito menos ambígua quando você tem caracteres que precisariam ser escapados por barra invertida para serem literais dentro da substituição de comando pelo último.Se estiver usando o bash, não há necessidade de comandos externos, como sed, basename, rename, expr, etc.
fonte
"${file%.*}.txt"
, mas isso pode ser perigoso para arquivos sem uma extensão.$
dentro do aparelho!--
"operator": mv - "$ file" "$ {file% .html} .txt" Esse operador evita nomes de arquivos que começam com um '-' de ser analisado por mv como argumentos.faz exatamente o que você quer.
fonte
Isso funcionou para mim no OSX de .txt a .txt_bak
fonte
.txt
que.txt_bak
você só tem que concatenar_bak
;).scss
para.sass
(após a conversão no local…):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
Você quer usar
rename
:Isso faz exatamente o que você deseja - alterará a extensão de
.html
para.txt
para todos os arquivos correspondentes*.html
.Nota: Greg Hewgill indica corretamente que este não é um bash embutido; e é um comando Linux separado. Se você só precisa de algo no Linux, isso deve funcionar bem; se você precisar de algo mais entre plataformas, dê uma olhada em uma das outras respostas.
fonte
rename
programa não está relacionadobash
e também não está disponível em todas as plataformas. Eu só vi isso no Linux.rename -S .html .text *.html
onde-S
significa--subst-all
Em um Mac ...
brew install rename
rename -S .html .txt *.html
fonte
Para usuários do Ubuntu:
fonte
Esta é a solução mais eficiente que encontrei que funciona no OSX e Linux e também funciona bem com o git!
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' - '{}' \;
fonte
Aqui está um exemplo do comando renomear:
O -n significa que é uma execução de teste e, na verdade, não altera nenhum arquivo. Ele mostrará uma lista de arquivos que seriam renomeados se você removesse o -n. No caso acima, ele converterá todos os arquivos no diretório atual de uma extensão de arquivo .htm para .html.
Se a saída da execução de teste acima parecer boa, você poderá executar a versão final:
O -v é opcional, mas é uma boa idéia incluí-lo, pois é o único registro que você terá das alterações que foram feitas pelo comando rename, conforme mostrado na amostra de saída abaixo:
A parte complicada do meio é uma substituição de Perl com expressões regulares, destacada abaixo:
fonte
Esta pergunta menciona explicitamente o Bash, mas se você tiver o ZSH disponível, é bastante simples:
Se você conseguir
zsh: command not found: zmv
, basta executar:E então tente novamente.
Obrigado a este artigo original pela dica sobre o zmv.
fonte
Após o rastreamento do site de outra pessoa, acabei com milhares de arquivos ausentes na extensão .html, em uma grande árvore de subdiretórios.
Para renomear todos eles de uma só vez, exceto os arquivos que já possuem uma extensão .html (a maioria deles não tinha nenhuma), isso funcionou para mim:
No caso do OP, eu posso modificar isso um pouco, para renomear apenas arquivos * .txt, da seguinte maneira:
Quebrado (hora do martelo!):
-iname * .txt
- significa considerar SOMENTE arquivos que já terminam em .txt
mv -iv "{}. {txt, html}" - Quando find passa a {} como o nome do arquivo, $ {filename%. *} extrai seu nome de base sem nenhuma extensão para formar os parâmetros para mv . o bash usa o {txt, html} para reescrevê-lo como dois parâmetros, para que o comando final seja executado como:
mv -iv "filename.txt" "filename.html"
Correção necessária: lidar com espaços nos nomes de arquivos
fonte
O comando
mmv
parece executar essa tarefa com muita eficiência em um grande número de arquivos (dezenas de milhares em um segundo). Por exemplo, para renomear todos os.xml
arquivos para.html
arquivos, use este:o
;
corresponderá ao caminho,*
corresponderá ao nome do arquivo e estes serão referidos como#1
e#2
no nome de substituição.As respostas baseadas em
exec
ou pipes foram muito lentas ou com falha em um número muito grande de arquivos.fonte
Tente isto
uso:
fonte
Um pouco atrasado para a festa. Você poderia fazer isso com xargs:
Ou se todos os seus arquivos estiverem em alguma pasta
fonte
ls
. Não analise . Esse comando é ridículo: ele usa um glob inutilmentels
, em vez de usar diretamente o glob. Isso quebrará os nomes de arquivos que contêm espaços, aspas e (devido à falta de aspas) caracteres glob.Esta é uma boa maneira de modificar várias extensões ao mesmo tempo:
Nota: tenha cuidado com o tamanho da extensão para ser o mesmo (o ???)
fonte
Agradável e simples!
fonte
Se você preferir PERL, existe um pequeno script PERL (originalmente escrito por Larry Wall, o criador do PERL) que fará exatamente o que você deseja aqui: tips.webdesign10.com/files/rename.pl.txt .
Para o seu exemplo, o seguinte deve fazer o truque:
fonte
Similar ao que foi sugerido antes, foi assim que eu fiz:
Eu primeiro validei com
fonte
Uma linha, sem loops:
Exemplo:
fonte
Infelizmente, não é trivial fazer portably. Você provavelmente precisa de um pouco de magia expr.
Remova o eco quando estiver feliz, pois ele faz o que deseja.
Edit:
basename
provavelmente é um pouco mais legível para este caso em particular, emboraexpr
seja mais flexível em geral.fonte
Aqui está o que eu costumava renomear
.edge
arquivos para.blade.php
Funciona como charme.
fonte
Você também pode criar uma função no Bash, adicioná-la
.bashrc
ou algo assim e usá-la onde quiser.Uso:
Origem do código na função: https://stackoverflow.com/a/1224786/6732111
fonte
Renomeie as extensões de arquivo para todos os arquivos no diretório e subdiretórios atuais sem outros pacotes (use apenas o shell script):
Crie um script de shell
rename.sh
no diretório atual com o seguinte código:Corra
./rename.sh .old .new
.Por exemplo.
./rename.sh .html .txt
fonte