Como remover todos os arquivos e subdiretórios em um diretório SEM excluir o diretório no bash?


53

Existe um comando para remover todos os arquivos e subdiretórios em um diretório SEM excluir o diretório?

Por exemplo, se eu tiver o diretório "dontDeleteMe" com os subdiretórios "1", "2", "3" e cada subdiretório tiver algumas imagens, como remover os subdiretórios "1", "2" e "3" e todos os arquivos neles, sem remover o diretório pai "dontDeleteMe"?

Respostas:


66

Para remover tudo em um diretório sem removê-lo, digite:

rm -rfv dontDeleteMe/*

Observe que a /*peça é muito importante. Se você colocar um espaço antes do *, ele excluirá todos os seus arquivos no diretório atual.

Além disso, ter muito cuidado jogar com rm, -re *todos no mesmo comando. Eles podem ser uma combinação desastrosa.

Atualização: Ok, percebi que se você tem arquivos ocultos / pontos [nomes de arquivos com pontos no início, ex .hidden], isso deixará esses arquivos intactos.

Realmente, a solução mais simples para a pergunta original é: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Outro seria usar finda -execopção ou canal para xargs(abaixo):

find dontDeleteMe/* -print0 | xargs -0 rm -rv


Você pode dar um exemplo do uso de xargs? O que é xargs?
justingrif

@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv Eu acredito que na maioria dos casos isso funcionará, independentemente dos espaços, e quais não. Faça um cd /tmp/e crie um diretório de teste e experimente. :)
Matt

Oh, e da manpage: "xargs - construir e executar linhas de comando da entrada padrão"
Matt

5
A reformulação de um diretório não é igual à exclusão de seu conteúdo. por exemplo umask diferenças de permissão de diretório, diferenças proprietário, etc ... A resposta de enzotib iria resolver os problemas com a sua sintaxe originais

3
Esta não é uma boa resposta. Usar * é perigoso e não funcionará em arquivos de ponto sem o "dotglob" (veja abaixo). rm -rf dontDeleteMe && mkdir dontDeleteMenão garante que o diretório seja recriado com as mesmas permissões / proprietários. Em vez disso, use uma das find dontDeleteMe/ -mindepth 1 -deletevariantes abaixo.
Nils Toedtmann

27

O único motivo rm -r ./*nem sempre funciona é porque você pode ter arquivos e / ou pastas ocultos que não são correspondentes *.

Para esse fim, bashforneça uma opção para fazer *corresponder tudo, até objetos ocultos:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Pode ser útil redefinir dotglobpara o estado padrão (não configurado), se você continuar usando o shell em que executou os comandos acima:

shopt -u dotglob 

Também não pode funcionar quando você tem um grande número de arquivos
S ..

23

Terminal aberto ( Ctrl+ Alt+ T) e digite este:

find somedir -mindepth 1 -delete

Isso irá corresponder a todos os arquivos e diretórios dentro somedire crianças a sua (Grand-), incluindo arquivos "escondidos" Dot mas excluindo somedir-se por causa de -mindepth 1, então -deleteeles.


Bem-vindo ao AskUbuntu! Embora sua resposta possa potencialmente ajudar o pôster original, a falta de informações para explicar o que isso faria para ajudá-lo torna sua resposta incompleta.
Oyibo

3
Falta explicação, mas ainda é a melhor resposta. Também funciona no OSX (exceto pela maneira de abrir o Terminal, é claro).
noamtm

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Use a xdevopção para excluir arquivos apenas dentro do limite do dispositivo.


A localização do GNU possui -delete. Isso implica -depthe é mais fácil de lembrar do que-depth -exec rm -Rf {} \;
#

4

Para excluir (no terminal) todos os arquivos e subdiretórios, exceto o diretório base chamado "dontdelete":

rm -rf dontdelete/*

Isso não exclui arquivos ocultos; portanto, "todos os arquivos" pode ser uma declaração muito ousada.
Stefan van den Akker

4

Você pode usar findcom a -deletebandeira:

find dontDeleteMe/* -delete

O /*importante é que ele diz findpara pesquisar somente DENTRO da pasta chamada "dontDeleteMe".

Verifique também se o -deletesinalizador está no final do findcomando.


11
Esta solução não exclui nenhum arquivo oculto, a menos que você o habilite dotglob. Caso contrário, usar a -mindepth 1opção de sinalizador parece a única maneira de fazê-lo funcionar.
Stefan van den Akker

3
rm -rf  directory/{.*,/*}

O que diz:

Remova todos os arquivos começando com. no "diretório" e em todos os outros arquivos também.

Embora, como gentilmente observado por Neftas, essa solução não seja segura!

A solução mais segura é:

 rm -rf directory/!(.|..)

Esse comando pode ser potencialmente perigoso, já que você também inclui diretórios .e ... Isso pode ser evitado alterando {.*}para {.??*}, mas você não excluirá arquivos ocultos com apenas um caractere, como .a.
Stefan van den Akker

o que é isso? rm diretório rf /! (|. ..)
Tebe

Parece uma solução muito melhor do que a que eu criei. Posso sugerir que você edite sua resposta?
Stefan van den Akker

sugestão aceita)
Tebe

1

Não sei por que isso é tão complexo, me ajude se estiver errado

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

É isso aí


Isso tem a pequena falha de tentar excluir o diretório atual também, o que, é claro, não funciona, porque ainda está sendo usado como o diretório de trabalho do shell de chamada.
precisa

1

Há uma resposta ainda mais simples:

  1. cd dontDeleteMe

  2. rm -rf *

Tempo de aula sobre administração básica do sistema: preste atenção em onde você está quando usar comandos de varredura como este.

Eu não posso dizer isso o suficiente. Eu tive que recuperar uma caixa porque alguém não estava prestando atenção e digitou rm -rf *enquanto estava em /.

* O nix assume que, se você é root ou está fazendo um root como root, sabe o que está fazendo. Portanto, verifique se você sabe o que está fazendo antes de fazê-lo.

Uma alternativa que garante que o comando 'cd' funcione antes de você emitir o 'rm' é usar

cd dontDeleteMe && rm -rf *

6
Esta é uma sugestão perigosa. O que você quer é: cd dontDeleteMe && rm -rf *
Izkata 26/10/11

@ Izkata Ou verifique se a operação do cd foi bem-sucedida antes de emitir o comando rm.
Elias Kagan

11
@EliahKagan Isso é exatamente o que o meu trecho de código faz ...
Izkata

Na verdade, não é mais ou menos perigoso do que o que você sugere. Tudo o que o && faz é encadear os dois comandos juntos para que eles sejam executados ao mesmo tempo. Se alguma coisa, meu método é realmente MAIS SEGURO, pois você precisa parar e .look antes de executar o rm -rf *. Pausar para verificar novamente é sempre melhor.
precisa saber é o seguinte

5
@ user30619 O &&operador não apenas encadeia os comandos; requer que cada comando seja bem-sucedido antes que o próximo seja executado. Se o cdcomando falhar por qualquer motivo (o diretório não existe, privilégios, etc.), o rmcomando não será executado. Eu chamaria isso de mais seguro.
955

0
  1. A coisa mais fácil para mim - um especialista em janelas, mas um novato no ubuntu
  2. Clique no ícone Arquivos no iniciador
  3. Navegue para o diretório em que os arquivos e pastas estão localizados que você deseja excluir
  4. Clique com o botão direito em uma área em branco da janela ao lado dos arquivos e clique em "Abrir no Terminal" - deixe a janela Arquivos aberta
  5. Uma janela do terminal será aberta e será "definida" para a pasta que você localizou
  6. Você pode digitar "dir" (desconsidere aspas quando digo digitar) e pressione enter no terminal para mostrar uma lista de arquivos e pastas - apenas para provar que você está "na" pasta correta
  7. digite "rm -rf *" e pressione enter
  8. dependendo do tamanho das pastas / arquivos a serem excluídos, o sistema pausará
  9. Quando o prompt do terminal retornar, a janela Arquivos que você abriu agora exibirá "A pasta está vazia"
  10. Eu tive sucesso com esse método e me proporcionou conforto ver os arquivos / pastas na janela Arquivos e como resultado do comando Dir na janela do terminal
  11. Também fiquei confortado com o fato de a janela Arquivos exibir a pasta agora vazia - principalmente porque eu procurava esses arquivos procurando a pasta lixeira em que estavam.
  12. Obrigado a todos que enviaram respostas - foi muito informativo

Isso parece bastante complicado - especialmente porque você vai acabar correndo rm -rf *mesmo assim.
David Foerster

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.