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

17

O 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 que terminam com '~'

Eu pensei que rm -r *~ .iria excluir todos os arquivos em toda a árvore, mas eu digitei rm -r ~.

Havia uma mensagem de que algum diretório não pôde ser excluído e fechei o comando. A pergunta é: O que eu tenho excluído?

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

GUI Junkie
fonte
4
Bem, pelo menos eu tenho uma estratégia de backup ... Nenhum dano real foi causado.
GUI Junkie
2
Bom saber; Eu tenho uma política de nunca usar, a -rmenos que queira me livrar de tudo.
Ish
3
Como uma nota lateral, rm -r *~ .excluiria todos os arquivos e pastas (no diretório atual) correspondentes *~ou .. ( .seria ignorado rmcomo uma exceção especial, pois a maioria das pessoas não deseja excluir recursivamente o diretório atual. *~Exclui todos os arquivos e diretórios no diretório atual que terminam em ~, mas não os arquivos e diretórios nos subdiretórios do diretório atual. ) Portanto, não é isso que você gostaria. Você provavelmente desejaria usar findcom o -execsinalizador para examinar recursivamente a árvore de diretórios e excluir não recursivamente cada arquivo que termina em ~.
Eliah Kagan
@EliahKagan, acho que sim, mas encontrar com -exec é sempre um aborrecimento. Restaurar a dir casa é mais de um aborrecimento, embora :-)
GUI Junkie
11
Informativo: cantar o ~personagem sem sair dele (assim \~:) fará com que Bash, ZSH, etc. (o rmcomando basicamente) pense que você quer dizer o diretório inicial.
Thomas Ward

Respostas:

31

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

rm -r something exclui recursivamente arquivos e diretórios em / sob algo ; ele falhará apenas nos itens que não têm 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), obteria algo como:

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

Nesse ponto, você pode abortar e provavelmente perceberá que executou o comando errado.

Sugestões da comunidade sobre como evitar esses acidentes

Nota: wiki da comunidade, todo mundo sinta-se à vontade para contribuir.

  • Para alguns arquivos, use a -iopção 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 a ./para evitar remover por engano um local diferente .:

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

    O acima foi para demonstrar o uso de ./. Se houver um subdiretório, é claro que você também pode usá-lo rm -v something/*~. Cuidado : não pense que rm ./.*remove todos os arquivos ocultos no diretório atual. Consulte esta questão sobre a falha do servidor para obter soluções alternativas em arquivos ocultos.

  • Mover em vez de excluir: em vez de excluir arquivos recursivamente, em primeiro lugar, me acostumei a mover os arquivos dos quais quero me livrar de outro lugar antes de excluí-los finalmente. Se algo der errado, é fácil restaurar.

    mv -b SOURCE DEST
  • Use find(possivelmente com grep) para visualizar se você deseja excluir recursivamente os arquivos selecionados. Você deve tentar fazer disso uma ocorrência rara, mas se precisar ...

    1. findsem argumentos recursivamente lista todos os arquivos / diretórios no atual. Você deve tentar descobrir man findcomo torná-lo seletivo (um tesouro), mas se você não quiser se preocupar, basta usar o familiar greppara filtrar os arquivos que deseja excluir.
    2. Suponha que eu seja um hacker do kernel uber-l33t e me incomode com os poucos KBs de arquivos "exemplo" na minha árvore de origem; Eu quero excluir todos os arquivos que contêm isso no nome. Então eu digito find | grep example, o que me dá esses 20 arquivos. Parece bom, então agora vou excluir os arquivos exatos, juntamente com a rm -vsaída detalhada mencionada anteriormente, via xargs:
      encontrar | exemplo grep | xargs rm -v
      o que me dá essa saída. Essa visualização evita problemas onde, digamos, você digita e digita em samplevez de example.

A solução acima não deve ser usada se você tiver nomes de arquivos que contenham espaços, caracteres de tabulação, novas linhas ou aspas ( "ou '), pois isso pode resultar xargsem falha ou alimentar rmcom nomes de arquivos incompletos, que na pior das hipóteses podem acabar removendo o erro errado. arquivos. A maneira segura de fazer o acima é fazer tudo com findos operadores e ações.

A seguir, serão mostrados todos os arquivos que contêm a palavra example

find . -name "*example*"  

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

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

Consulte Usando o Find para obter mais ajuda sobre o uso find.

Lekensteyn
fonte
11
findsaída da tubulação para grepe xargs rmé perigosa.
Geirha
2
@izx: adicionado mv(meu comando favorito);)
Takkat
11
Eu adicionaria pelo menos um exemplo de uso findda maneira segura, uma que não quebre (e potencialmente exclua os arquivos errados) se os nomes de arquivos contiverem espaço, guia, nova linha "ou 'caracteres. Por exemplo find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha
11
@geirha: por que é find -deletetão perigoso? Eu teria dito algo aqui, mas não sei outro além do que foi encontrado recentemente e limpou o meu, /apesar de uma execução a seco sem a opção, -deleteencontrei apenas alguns arquivos que eu queria remover. Vejo que você recomenda -exec rm.
Takkat
3
O @Tkkat -deletenão é perigoso, e você pode usá-lo com segurança em vez de -exec rm {} +. Geralmente, prefiro usar ferramentas e recursos padrão sempre que possível. -deleteé uma extensão GNU não-padrão para find, portanto funcionará bem no Ubuntu, mas pode não em outros sistemas.
geirha
5

Sim. Um caractere til sem aspas como argumento separado é expandido para o seu homedir. Então rm -r ~foi expandido para rm -r /home/yourusename. Então você disse à rm para excluir recursivamente todos os arquivos em sua casa.

Consulte http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion para obter mais informações sobre como funciona a expansão til.

Geirha
fonte