Como excluir todos os arquivos e diretórios ocultos usando o Bash?


28

A solução óbvia produz um código de saída 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

Uma solução possível pulará o "." e diretórios "..", mas excluirá apenas arquivos cujos nomes tenham mais de 3 caracteres:

bash$ rm -f .??*

Bem, se você não estiver muito preocupado em não conseguir remover. & .. então quem se importa? a menos que você esteja preocupado com a saída feia em um script, acho que a solução óbvia é menos tipográfica do que as outras, francamente.
Matt

Só para você saber ... e. não são arquivos. Eles são referências a diretórios. . (apenas um ponto) é o diretório atual e .. (dois pontos) é um link para o diretório em um nível superior. Por exemplo, se cd / home / user,. é igual a / home / user e .. é / home / Em outras palavras, você não pode excluir o arquivo. e .. (.?)
phuzion

Obrigado pelo comentário Matt. Costumo usar o comando em scripts com verificação de código de saída por comando (set -e). Nestes casos, é necessário um código de saída indicativo.
Yonatan Broza 31/07/2009

Não há nada inerente. e .. que os protege da exclusão com rm -rf. Este é apenas um mecanismo de proteção adicionado às variações modernas de rm.
Kubanczyk

E sempre há rm -rf. * || true se você quiser apenas contornar o comportamento set -e dessa declaração.
Domingo Ignacio Galdos

Respostas:


34
rm -rf. [^.]. ?? *

Deve pegar todos os casos. O. ?? * corresponderá apenas a nomes de arquivos com mais de 3 caracteres (como explicado na resposta anterior), o. [^.] Capturará quaisquer duas entradas de caracteres (exceto ..).


Obrigado pela resposta! Com base nisso, eu também cheguei à versão mais curta de "rm -rf. [^.] *".
Yonatan Broza

4
Tenha cuidado com essa versão mais curta, ela dará resultados semelhantes, mas não idênticos. Não vai coincidir com nomes com dois pontos na frente (por exemplo, "... /", que às vezes é visto rootkits esconderijos, etc.)
Russell Heilling

E ter o cuidado de fazer um teste de PCD ou u perder todas as suas configurações :)
kommradHomer

Isso não parece funcionar zsh. Alguma sugestão?
Ryanjdillon #

Com zshpor padrão um coringa vazia é tratada como um erro; enquanto que com bashisso é simplesmente passado inalterado. Para fazer com que zshse comportam da mesma maneira que você pode usar o comandounsetopt nomatch
Russell Heilling

1
find -path './.*' -delete

Isso corresponde a todos os arquivos no diretório atual que começam com a .e os excluem recursivamente. Arquivos ocultos em diretórios não ocultos não são tocados.

Caso você realmente desejasse apagar tudo de um diretório, find -deleteseria suficiente.


Isto irá apagar tudo, não apenas as entradas começando com.
kasperd

Ah, parece que eu interpretei a pergunta como "exclua tudo, incluindo arquivos ocultos" ... Bem, meu mal.
Fritz

@ Kasperd Obrigado, agora deve realmente responder à pergunta.
Fritz

0

melhor maneira provavelmente é:

  • encontrar . -iname. * -maxdepth 1 -type f -exec rm {} \;

altere rm para ls -l se você quiser apenas ver o que seria excluído, para detalhar a saída, u pode querer adicionar a opção -v para rm

  • -type f options diz ao comando find para procurar apenas arquivos (omitir dirs, links etc.)
  • -maxdepth 1 diz ao find para não descer para subdiretórios

ps. não esqueça de terminar '\;'


11
Cuidado! Você quer dizer -iname '. *' Ou -iname. * Ou então você arrastará. e .. de qualquer maneira.
Domingo Ignacio Galdos

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

Isso interrompe o instante em que você tem um arquivo com espaço em branco no nome.
um CVn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.