★ 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"/'