Tela Preta episódio 8: Trocar a extensão de arquivos com find|sed|sed|sh

★ Lista de episódios da série Tela Preta: 1 2 3 4 5 6 7 8 9

Vídeo novo na área! Saiu mais um episódio da série Tela Preta.

Tela Preta é a minha série de vídeos nerds gravados na linha de comando do Unix, demonstrando o “jeito shell script” de resolver problemas. Todos os vídeos contam com narração e legendas em português, estão em alta resolução (HD) e são reais: sem ensaio, sem cortes, sem edição posterior. Assine meu canal lá no YouTube para ser notificado(a) quando sair um vídeo novo.

Desta vez a tarefa é bem simples: trocar a extensão de vários arquivos. A pegadinha é que eles são muitos (dezenas, inviável fazer “na mão”) e estão espalhados em várias subpastas.

Como você faria?

Talvez usar um loop seja a tentativa mais óbvia, em shell ou outra linguagem. Aí dentro do loop você lida com o nome de cada arquivo para remover a extensão atual e adicionar a nova.

Que tal pensar fora da caixa? Nada de loop, pra começar. Com um único find você obtém a lista completa de todos os arquivos a serem renomeados. Essa lista de arquivos é então transformada em uma lista de comandos. Adivinha quem faz isso? O sed, claro :)

Com uma lista de comandos prontos, basta aplicar aquela técnica que já mostrei no episódio 3, de colocar um | sh no final para executar todos os comandos vindos da entrada padrão (STDIN). E fim de papo!

Resumo dos comandos:

  • find — encontra arquivos
  • sed — edita linhas
  • sh — abre nova shell

Saiba mais sobre os tópicos do vídeo:

Histórico da linha de comando:

ls
find . | wc -l
ls -l app/views/layouts/
find . -name '*.rhtml'
find . -name '*.rhtml' | wc -l
find . -name '*.rhtml'
mv ./app/views/users/show_follow.rhtml ./app/views/users/show_follow.html.erb
find . -name '*.rhtml'
find . -name '*.rhtml' | sed 's/.*/mv & &/'
find . -name '*.rhtml' | sed 's/.*/mv & &/' | sed 's/\.rhtml$/.html.erb/'
find . -name '*.rhtml' | sed 's/.*/mv & &/' | sed 's/\.rhtml$/.html.erb/' | wc -l
find . -name '*.rhtml' | sed 's/.*/mv & &/' | sed 's/\.rhtml$/.html.erb/' | sh
find . -name '*.rhtml'
find . -name '*.html.erb'

Dicas adicionais:

  • Eu esqueci no vídeo, mas era melhor ter composto o comando mv com a opção -v, para que mostrasse na tela cada arquivo renomeado, só pra confirmar. O primeiro sed ficaria assim: sed 's/.*/mv -v & &/'

  • Caso as pastas ou arquivos tenham nomes com espaços em branco, é preciso colocar aspas ao redor dos nomes dos arquivos, ao compor o comando mv. É bem fácil, basta alterar o primeiro sed e colocar as aspas nos dois &, assim: sed 's/.*/mv -v "&" "&"/'. Porém, isso quebra o segundo sed, que também precisa levar as aspas em conta agora: sed 's/\.rhtml"$/.html.erb"/'

— EOF —

Gostou desse texto? Aqui tem mais.