Prevenindo acidentes com o comando RM

Alguns passos que podem ajudar a prevenir remoções de arquivos acidentalmente com o comando RM.

[ Hits: 17.147 ]

Por: Fernando Luis Basso em 10/01/2012


Soluções sugeridas



RM - Prevenindo Acidentes

Tópicos:
  • Comando 'rm' não tem 'trash' (lixeira)
  • Solução nº 1 - interactive mode
  • Solução nº 2 - um alias para o interactive mode
  • Solução nº 3 - trash-cli - lixeira na linha de comando

Comando rm não tem trash

Cuidado!!! No terminal, na linha de comando, quando se digita:

# rm segredo_mundial.txt

O arquivo "segredo_mundial.txt" já era. Não tem mais o que fazer.

Solução nº 1 - Interactive Mode

Sempre use a opção '-i', ou '--interactive' com o comando 'rm' e torne isto um hábito. Esta opção se prontifica a nos perguntar se realmente desejamos deletar o arquivo:

rm -i segredo_mundial.txt
$ rm --interactive segredo_mundial.txt


Cuidado com a flag '-f' ou '--force'. Com ela, as opções '-' ou '--interactive' se tornam inúteis, ou seja, eles são completamente ignorados.

Há um truque que pode ser aplicado, digamos que temos um diretório contendo arquivos muito importantes. Podemos criar um arquivo chamado '-i' dentro deste diretório.

Como o arquivo contém '-' no nome, não podemos simplesmente fazer 'touch -i', pois o comando 'touch' vai pensar que estamos passando a opção '-i' como argumento, e o comando 'touch' nem tem uma opção chamada '-i'.

As duas possíveis maneiras de criar o tal arquivo estão exemplificadas abaixo:

touch -- -i

Ou:

touch ./-i

A partir de agora, se você fizer:

rm -Rf *

O shell vai expandir o '-i' na linha de comando, de tal forma que seu comando na verdade se transforma em:

rm -Rf -i

Note que isto só funciona se você usar o 'glob' (*). Se tentar deletar um arquivo por vez, o arquivo '-i' não vai te ajudar.

Vamos aprender outro truque quando falarmos do programa 'trash-cli'.

Se quiser remover o arquivo '-i', não basta fazer 'rm -i' porque o 'rm' tem de fato a opção '-i'. Então 'rm -i' é o comando 'rm', seguido da opção '-i'; mas ainda falta dizer ao 'rm' qual arquivo ou arquivos deletar, por que ele não sabe que '-i' é um arquivo e não uma opção.

Usamos uma técnica similar à que usamos para criar o arquivo. As duas soluções possíveis são:

rm -- -i

Ou:

rm ./-i

Solução nº 2 - um alias para o Interactive Mode

A solução nº 2 consiste em colocar o que aprendemos acima em um 'alias' (um apelido em Inglês).

Vamos criar um alias que faz com que o comando 'rm' sempre seja executado com 'rm --interactive':

alias rm='rm --interactive'

Digite o comando acima em um terminal e tente remover um arquivo (não teste com nada que seja importante). Para testar, rode apenas 'rm arquivo.txt' e você vai notar que ele pergunta se temos mesmo certeza de que queremos deletar o arquivo em questão.

Se você gostou da ideia, coloque o comando que cria o 'alias' no "~/.bashrc". Para que o 'alias' entre em vigor, feche e abra o terminal novamente ou rode o comando:

source ~/.bashrc

A partir de agora, toda vez que você digitar 'rm', o Bash interpreta o 'alias' e na verdade vai executar 'rm --interactive'.

Solução nº 3 - trash-cli - lixeira na linha de comando

Instale o programa 'trash-cli'. Enquanto escrevo este documento, 'trash-cli' está disponível pelo AUR para o Arch Linux, mas pesquisas pela WEB fazem acreditar de que já está nos repositórios oficiais de muitas distribuições.

O programa 'trash-cli' vem com três comandos principais:

1. trash-empty: esvazia a lixeira;
2. trash-list: lista os arquivos da lixeira;
3. trash-put: manda arquivos para a lixeira.

Para mais informações, leia o Help de cada uma das variações do 'trash-cli':

$ trash-empty --help
$ trash-list --help
$ trash-put --help


O problema agora é criar o hábito de usar o 'trash-cli' em vez do bom e velho 'rm'. Sim, porque nós instalamos o programa, mas por força do hábito é bem provável que continuemos usando o 'rm' sem nem notar.

Vamos então usar um truque para, digamos, desabilitar o comando 'rm'. O truque consiste em, novamente, criar um 'alias'. Mas antes disso vamos falar de comentários no Bash (com poucos ajustes todas essas dicas funcionam em outros shells).

Um comentário no Bash inicia com '#'. Rode o seguinte comando direto do terminal:

# echo 'Hello, world.'

Essa linha não vai executar nada. É um comentário apenas. Tente esta outra:

echo 'Hello, ' # world'

O 'echo' acima só vai mostrar 'Hello, '. O resto da linha é comentário.

Então, a ideia é criar um 'alias' que comente o 'rm'. É fácil:

alias rm='# rm'

Pode colocar o 'alias' no "~/.bashrc" e rodar 'source ~/.bashrc'. A partir de agora, toda vez que você digitar 'rm', ele simplesmente nem sequer será executado, pois agora ele foi 'comentado'.

No então, há alguns pontos a serem considerados:

1. Se você executar outro Shell a partir do shell que contém o 'alias', o outro shell não vai herdar o 'alias', portanto, 'rm' desse outro shell vai funcionar normalmente.

2. Importante: você executou essas operações no terminal como usuário, e configurou o "~/.bashrc" em nível de usuário. A conta do Root continua com as configurações default. Como o Root é um usuário ainda mais crítico no sistema, considere colocar essas configurações no "/root/.bashrc".

Fiz esse arquivo no Vim. Quem quiser pode baixar a versão que converti com o TOhtml.
Nota: O WordPress não me permitiu fazer upload do arquivo HTML e nem Zip, então eu renomeei ele para ".pdf" para poder fazer o upload. Baixe o arquivo e renomeie a extensão para ".html" novamente antes de tentar abrir o arquivo.
   

Páginas do artigo
   1. Soluções sugeridas
Outros artigos deste autor

Expressões regulares no Bash : parte I

Configuração de Indentação no Vim - Tabs e Espaços

Leitura recomendada

Erro no KDM (temas) depois de update no Sabayon

Configurando o CACIC (parte 1) - Atualizado

Otimizando o seu Slackware pra valer com o SlackBuild

Senha de root - Como bloquear com segurança

Configurando um servidor NFS em 4 passos

  
Comentários
[1] Comentário enviado por JJSantos em 10/01/2012 - 11:16h

Muito bom. 10
Favoritado.

[2] Comentário enviado por FernandoBasso em 10/01/2012 - 15:05h

Esqueci de mencionar no artigo, depois que o shell encontra "--", nada mais dali em diante será interpretado como opção. Por exemplo, no comando "touch -- -i", por causa do "--" o "-i" não será interpretado como uma opção para o comando touch. Em outras palavras, "--" indica o fim das opções de um comando.

[3] Comentário enviado por BlackMarik em 10/01/2012 - 20:27h

Podemos também fazer este alias, para facilitar "alias rm='trash-put'", estou certo?

[4] Comentário enviado por FernandoBasso em 10/01/2012 - 20:54h

Acredito que sim.

Eu não cheguei a mencionar isso porque não pesquisei quanto a fazer um alias com o "rm" em si e não sei que consequências isso teria, e como o tutorial vai ficar na web preferi não incentivar essa prática, justamente pelo fato de eu não ter total conhecimento do assunto. Acho que não faria mal algum, até por que qualquer coisa é só deletar o alias.

Mas com certeza é uma possibilidade. Talvez até a melhor. :)


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts