O que 'rm -r ~' fez no meu diretório pessoal?

16

gedit cria arquivos de backup ocultos que terminam com '~'. Eu queria fazer uma limpeza recursiva da minha árvore de diretórios.

O comando rm *~ excluirá todos os arquivos locais terminados em '~'

Eu achei que rm -r *~ . excluiria todos os arquivos na árvore inteira, mas eu digitei rm -r ~ .

Houve uma mensagem de que algum diretório não pôde ser excluído e encerrei o comando. A questão é: o que eu estou excluindo?

Eu notei que minha configuração do Filezilla havia desaparecido. Esse comando exclui todos os diretórios ocultos do diretório inicial?

    
por GUI Junkie 29.06.2012 / 10:48

2 respostas

31

Você excluiu (quase) todo o seu diretório pessoal!

rm -r something recursivamente exclui arquivos e diretórios em / sob algo ; ela falhará somente nos itens que ela não tem permissão para excluir, porque eles pertencem a um usuário diferente (por exemplo, root ) ou porque estão em uso (por exemplo, uma montagem GVFS).

Se você não adicionou -f (como em rm -rf something ), você receberia algo como:

rm: remove write-protected regular file ‘something’?
rm: descend into write-protected directory ‘something’?

Neste momento você pode abortar e você provavelmente perceberá que executou o comando errado.

Sugestões da comunidade sobre como evitar esses acidentes

  

Nota: wiki da comunidade, todos por favor sintam-se à vontade para contribuir.

  • Para alguns arquivos, use a opção -i para obter uma confirmação sobre a remoção de arquivos ou diretórios:

    $ rm -ri something/
    rm: remove regular file ‘something/file~’? y
    rm: descend into directory ‘something’? y
    rm: remove regular file ‘something/file’? y
    rm: remove directory ‘something’? y
    
  • Se estiver removendo de um diretório atual, prefixe-o com um ./ para evitar remover erroneamente um local diferente.

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’
    

    O acima foi para demonstrar o uso de ./ . Se houver um subdiretório, você também poderá usar rm -v something/*~ . Cuidado : não pense que rm ./.* remove todos os arquivos ocultos no diretório atual. Veja esta pergunta sobre o Serverfault para obter soluções alternativas para a globalização de arquivos ocultos.

  • Mover em vez de excluir: Em vez de excluir arquivos recursivamente, em primeiro lugar, me acostumei a mover os arquivos que eu quero remover em algum outro lugar antes de apagá-los. Se algo deu errado, é fácil restaurá-lo.

    mv -b SOURCE DEST
    
  • Use find (possivelmente com grep ) para visualizar se desejar excluir recursivamente os arquivos selecionados. Você deve tentar tornar isso uma ocorrência rara, mas se você tiver que ...

    1. find sem argumentos lista recursivamente todos os arquivos / diretórios sob o atual. Você deve tentar procurar man find em como torná-lo seletivo (um tesouro), mas se você não quiser se incomodar, basta usar o familiar grep para filtrar os arquivos que deseja excluir.
    2. Suponha que eu seja um hacker de kernel do uber-l33t, e estou incomodado com os poucos KBs de arquivos de "exemplo" na minha árvore de fontes; Eu quero excluir todos os arquivos que contenham isso no nome. Então eu digito find | grep example , o que me dá esses 20 arquivos. Isso parece bom, então eu vou agora e excluo esses arquivos exatos , juntamente com a saída detalhada rm -v mencionada anteriormente, via xargs :
      find | grep example | xargs rm -v
      o que me dá esta saída. Essa visualização evita problemas, digamos, você comete um erro de digitação e digita sample em vez de example .

A solução acima não deve ser usada se você tiver nomes de arquivos contendo espaços, caracteres de tabulação, novas linhas ou citações ( " ou ' ), pois isso levará xargs a falhar ou feed rm com nomes de arquivos incompletos, que no pior dos casos pode acabar removendo os arquivos errados. A maneira segura de fazer o que foi dito acima é fazer tudo isso com os operadores e ações do find .

O seguinte mostrará todos os arquivos que contenham a palavra example

find . -name "*example*"  

Se essa lista for os arquivos que você deseja remover, use a ação -exec para passar os arquivos para rm .

find . -name "*example*" -exec rm -v {} +

Veja Usando o Find para obter mais ajuda sobre como usar find .

    
por Lekensteyn 13.04.2017 / 14:14
5

Sim. Um caractere de til sem nome como um argumento separado é expandido para o seu homedir. Então rm -r ~ foi expandido para rm -r /home/yourusename . Então você disse ao rm para deletar recursivamente todos os arquivos no seu homedir.

Consulte o link para saber mais sobre como funciona a expansão do til.

    
por geirha 29.06.2012 / 10:57