Como apagar todos os arquivos em um diretório atual começando com um ponto?

2

Eu uso o Ubuntu 14.04 e em um terminal eu me tornei root com o sudo su e queria deletar o lixo do root manualmente. Ele excluiu tudo, exceto alguns arquivos que começam com um ponto. Assim como eu fui para esse diretório (que é "arquivos") e eu corri este comando:

rm -rf .*

Ele excluiu esses arquivos, MAS também recebi uma mensagem de erro dizendo que o sistema não pôde excluir "." e ".." O que isso significa? Como se eu tentasse apagar toda a árvore de diretórios? Como eu disse, quando eu estava executando esse comando eu estava no diretório mais baixo. Este para ser exato: /root/.local/share/Trash/files/ Eu abati meu PC e liguei. Tudo parece normal à primeira vista. Então agora eu quero perguntar o que deu errado e se o que eu fiz realmente poderia causar algum dano sério ao sistema em geral? Em outras palavras, eu deveria estar preocupado agora ou está tudo bem?

    
por Gregory 19.09.2016 / 06:44

4 respostas

2

.* corresponde a todos os arquivos cujo nome começa com . . Cada diretório contém um arquivo chamado . , que se refere ao próprio diretório, e um arquivo chamado .. , que se refere ao diretório pai. .* inclui esses arquivos.

Felizmente para você, tentar remover . ou .. falha, para que você receba um erro inofensivo.

Em zsh, .* não corresponde a . ou .. . No bash, você pode definir

GLOBIGNORE='.:..:*/.:*/..'

e, em seguida, * corresponderá a todos os arquivos, incluindo arquivos de ponto, mas excluindo . e .. .

Como alternativa, você pode usar um padrão curinga que exclua explicitamente . e .. :

rm -rf .[!.]* ..?*

ou

rm -rf .[!.] .??*

Como alternativa, use find .

find . -mindepth 1 -delete
    
por 20.09.2016 / 02:49
3

Quando você deseja excluir todos os arquivos de pontos, a convenção é usar este comando:

rm .??*

Isso excluirá todos os arquivos que começam com um ponto contendo pelo menos dois outros caracteres, deixando . e .. intactos. Concedido, ele também perderá nomes de arquivos com apenas uma letra após o ponto, mas estes devem ser raros.

    
por 19.09.2016 / 08:51
1

Você pode ignorar o erro para seus objetivos.

Você usou correspondência de curingas. Não deve ser confundido com regex. Você disse excluir todos os arquivos que começam com a. e não tem nada, ou algo depois disso.

Agora, sua mensagem de erro é porque isso incluiria . e .. . . é um atalho para o diretório atual e '..' é um atalho para o diretório pai. (Tecnicamente, eles significam outra coisa, mas para essa conversa funciona).

Você não pode excluir o diretório em que está atualmente, senão onde você estaria? E você não pode excluir seu diretório pai, senão onde iria o diretório atual. Agora isso não é estritamente verdadeiro, você pode excluir seu diretório atual e seu diretório pai, mas as ferramentas (rm neste caso) são configuradas para torná-lo um pouco mais difícil, porque isso é um pouco contra intuitivo.

is what went wrong and if what I did could really cause any serious damage to the system in general?

Com base nas informações da sua pergunta, minha resposta é sim, você fez algo errado e, sim, você pode ter causado alguns danos bastante sérios em seu sistema.

Primeiramente, você executou esse comando com privilégios elevados. Você NUNCA deve fazer qualquer coisa recursivamente com privilégios elevados, a menos que já saiba o resultado. Você certamente nunca deve excluir QUALQUER coisa com privilégios elevados, a menos que saiba exatamente o que está fazendo. Da próxima vez, use mv . Dessa forma, se você estragar algo, você pode simplesmente movê-lo de volta.

Quanto ao dano que você realmente causou, sendo que você estava excluindo uma lixeira, provavelmente não muito, mas você realmente poderia ter, especialmente ao executar esse comando com privilégios elevados.

    
por 19.09.2016 / 06:59
0
find /path/to/dir -type f -name ".*" -delete
    
por 13.07.2018 / 09:40