🗞️ Parece loucura, mas além de um ótimo exercício, melhora muito o desempenho das tarefas.
Há um tempo atrás eu havia criado um script em Bash(Shell Script que limpava algumas coisas no meu sistema, dentre elas:
O cache de imagens que foram visualizadas, incluindo as thumbnails;
O cache dos navegadores que eu tinha instalado na minha máquina: Google Chrome, Firefox e Opera;
O histórico do Bash;
Os arquivos recentes;
E a lixeira!
O script funcionava normalmente, bastava eu rodar o comando limpeza no terminal.
No entanto, um belo dia quando rodei esse script, notei que ele demorou muito de executar. O motivo disso foi que na lixeira havia diversos arquivos .iso, somados acho que havia uns 5GB de tamanho!
E então eu pensei perguntando pra mim mesmo:
— Por que o Bash demorou tanto para remover???
E pensei:
— Se eu fizesse esse script em C++, será que demoraria tanto?!
Então, eu decidi fazer e testar! Após terminar de escrever, deletei uns 10GB de .iso(joguei na lixeira) e rodei o código pós-compilado pra testar com o comando time e comparei o resultado do mesmo comando com o do script em Bash.
E a diferença foi GRANDEEEE! Ou seja, o mesmo script feito em C++ foi muito mais rápido!
Bom, isso já faz muito tempo, mas decidi postar aqui, pois esse “script” serve de exercício para quem está treinando seus códigos C++, é uma boa você usar: C++ como Shell Script para aprimorar suas habilidades!
Nos próximos tópicos vou descrever cada linha/trecho do código e ao final haverá todos os arquivos separados para caso você queira compilar e testar na sua máquina.
Escrevendo o código
Como vamos compilar com CMake, o ideal é criar uma pasta para o projeto:
E então crie esse primeiro arquivo: vim limpeza.hpp:
Caso o usuário queira executar o código sem alterar/remover nada no seu PC, além de exibir o(a)s pastas/arquivos que serão removidos:
Armazena os caminhos dinamicamente:
Capta a pasta pessoal do usuário:
Tudo aquilo que iremos limpar, que falei no início:
Essas funções-membro declarei como: protected:
Imprime com Unicode e cores:
Recebe um array opcional com: caminho, mensagem true e mensagem false. Essas duas funções-membro fazem quase a mesma coisa, sendo que uma é para pastas e a outra para arquivos regulares:
E como public só declarei o construtor e run():
Recebe o modo debug como parâmetro:
Após isso criei a execução do código no arquivo: vim limpeza.cpp:
C++ não precisa de getters e setters sempre, como em Java. Você já pode(e deve) inicializar os membros com essa sintaxe no construtor. Nesse caso, inicializamos o m_debug e a m_path:
Essa função-membro chama as outras funções-membro e se o modo debug estiver ativado ela exibe o caminho, para você ter certeza que não deletará nada que não seja os arquivos/pastas especificados!
Essa print, organiza a saída para não ficar repetindo sempre:
Remove os diretórios:
se existir;
se der pra remover;
se não estiver vazio;
se o debug estiver desabilitado.
Tudo de forma segura e com todas as verificações possíveis! E cria um novo(quando for necessário) para agilizar o processo:
As mesmas ações da função-membro acima, mas para arquivos regulares e usa a std::ofstream em vez da std::filesystem para recriar os arquivos e não pastas:
E por final, nosso arquivo: vim main.cpp:
Note que passamos o --debug como parâmetro de forma opcional!
Se quiser instalar e usar para fazer suas limpezas, recomendo usar localmente(só para seu usuário):
Teste de novo para ver tudo que será ou não removido e depois rode definitivamente:
Lembrando que sem ser no modo debug, somente as ações que ele executar haverá saída. Po exemplo, você não tem o Opera instalado, ou já rodou o comando antes, ele não fará nada e nem exibirá!
Saída:
Se quiser que o histórico do terminal fique limpo após rodar tudo, adicione o isso ao final do seu ~/.bashrc assim:
limpeza(){${HOME}/.local/bin/limpeza $@history-c}
E releia o ~/.bashrc:
exec$SHELL# Ousource ~/.bashrc
Faça assim, pois rodar processos como esse com std::system além de não funcionar não é recomendado!
Futuramente pretendo mostrar outros scripts que eu fiz com C++ e depois organizar todos e pôr em um único repositório no GitHub.
Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!