Excluir Recursiva do Linux Mantendo o Primeiro Dir

6

Primeira pergunta aqui, geralmente estou no StackOverflow.

Eu preciso excluir todo o conteúdo de um diretório, mas não o diretório em si, pois não tenho permissão para excluir o diretório real. Isso parece simples, mas não consigo encontrar o comando para isso. Agradecemos antecipadamente.

    
por Marc 23.06.2009 / 18:54

8 respostas

11
rm -r /path/to/directory/*

ou

rm -rv /path/to/directory/*

se você quiser ver o que está acontecendo.

    
por 23.06.2009 / 18:57
2

Caos - Você está incorreto em sua preocupação de que o rm irá deletar ...

Eu fiz uma pesquisa rápida e encontrei as man pages do manual de unix da 7ª edição no link onde diz:

DIAGNÓSTICOS

   Generally  self-explanatory.   It  is forbidden to remove the file ..
   merely to avoid the  antisocial  consequences  of  inadvertently  doing
   something like rm -r .

Dado que a 7ª edição do Unix é o pai de todos os Unix modernos, e foi lançado em 1979, eu diria que é uma coisa enfaticamente segura. Não faz nada, mas não causa mal algum.

Agora, existem outros programas como o chown que irão alegremente "descer" para o .. e causar todos os tipos de caos se você fizer coisas malucas como "chown -Rh user. *" mas o rm não é chown.

    
por 25.06.2009 / 16:31
1

Versão fácil se o diretório atual funcionar bem:

find . ! \( -name . \) -print0 | xargs -0 rm -rf

Versão mais difícil se o diretório atual não for bom:

find /some/dir ! \( -samefile /some/dir \) -print0 | xargs -0 rm -rf
    
por 23.06.2009 / 19:59
0

encontrar / caminho / dir / tipo f - print | xargs rm

    
por 23.06.2009 / 18:57
0

Por que não apenas:

rm -rf directory

Você receberá uma mensagem de erro, pois não tem permissão para remover o diretório. Mas também removerá tudo no diretório, incluindo os arquivos ocultos problemáticos.

    
por 23.06.2009 / 20:13
0

Esta é uma daquelas áreas escuras do unix que podem ficar pegajosas rapidamente.

Cada um dos exemplos acima faz parte de um bug antigo no unix que hoje em dia as pessoas consideram uma pequena peculiaridade de personalidade.

encontre. | xargs rm

não funcionará se houver nomes de arquivos mal-intencionados no diretório, como novas linhas ou espaços em branco. Você pode até começar a apagar outros arquivos não no diretório, se houver um nome de arquivo com a; nisso. Quem sabe o que acontece se houver um nome de arquivo com um 'nele. Basta perguntar pequenas tabelas de queda bobby. As coisas podem ficar emocionantes rapidamente.

O comentário de Bill Weiss aponta corretamente que as versões modernas de find e xargs usam corretamente nulos como os separadores de campo para cada coisa que encontrar, se você usar o -print0 em find e -0 em xargs. Não sendo do tipo confiante, e tendo cortado meus dentes em versões mais antigas e aleatoriamente quebradas do unix, tenho a tendência de desconfiar desses novos gnuisms, mesmo que eles funcionem muito bem e, nesse caso, sejam a resposta correta para esse problema específico. / p>

rm -r / caminho / para / diretório / * não funcionará se você tiver 10.000 arquivos nesse diretório.

Agora - na maioria das vezes eu simplesmente não me dou ao trabalho de fazer isto direito, então eu usarei rm -rf e olharei o erro se houver um erro. Se eu tiver 100% de certeza de que não há arquivos estranhos, eu posso usar o find e o xargs, embora eu não confie muito neles.

Se eu estou fazendo isso em um script que é executado automaticamente, e eu não tenho idéia de quanto tempo isso vai ser usado ou quem vai usá-lo, eu tento fazer do jeito certo.

Eu não consigo pensar em uma maneira rápida, arrumada e confiável de fazer isso, mas acho que posso fazer isso com um script de shell bourne como:

for a in * .*
do
  rm -rf "$a"
done

Agora - isso é seguro porque o loop for protege a linha de comando de "rm" de ter um bilhão de entradas e as aspas duplas em torno da variável protegem de coisas malucas como caracteres de escape ou ponto e vírgula ou outro meta lixo. Também é muito mais lento que o find + xargs.

Então eu acho que a resposta certa é "Não há programa para fazer isso. Você tem que escrever um programa para fazer isso de forma confiável." Eu acho que é isso que o stallman fez com o find e o xargs ...

    
por 23.06.2009 / 19:23
0

Acredito que se poderia usar: rm -rf / test / *

    
por 25.06.2009 / 17:01
-1

Você pode tentar

# rm -rf [dir]/* [dir]/.*

    
por 23.06.2009 / 18:56