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"?
fonte
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. :)rm -rf dontDeleteMe && mkdir dontDeleteMe
não garante que o diretório seja recriado com as mesmas permissões / proprietários. Em vez disso, use uma dasfind dontDeleteMe/ -mindepth 1 -delete
variantes abaixo.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,
bash
forneça uma opção para fazer*
corresponder tudo, até objetos ocultos:Pode ser útil redefinir
dotglob
para o estado padrão (não configurado), se você continuar usando o shell em que executou os comandos acima:fonte
Terminal aberto ( Ctrl+ Alt+ T) e digite este:
Isso irá corresponder a todos os arquivos e diretórios dentro
somedir
e crianças a sua (Grand-), incluindo arquivos "escondidos" Dot mas excluindosomedir
-se por causa de-mindepth 1
, então-delete
eles.fonte
Use a
xdev
opção para excluir arquivos apenas dentro do limite do dispositivo.fonte
-delete
. Isso implica-depth
e é mais fácil de lembrar do que-depth -exec rm -Rf {} \;
Para excluir (no terminal) todos os arquivos e subdiretórios, exceto o diretório base chamado "dontdelete":
fonte
Você pode usar
find
com a-delete
bandeira:find dontDeleteMe/* -delete
O
/*
importante é que ele dizfind
para pesquisar somente DENTRO da pasta chamada "dontDeleteMe".Verifique também se o
-delete
sinalizador está no final dofind
comando.fonte
dotglob
. Caso contrário, usar a-mindepth 1
opção de sinalizador parece a única maneira de fazê-lo funcionar.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 é:
fonte
.
e..
. Isso pode ser evitado alterando{.*}
para{.??*}
, mas você não excluirá arquivos ocultos com apenas um caractere, como.a
.Não sei por que isso é tão complexo, me ajude se estiver errado
É isso aí
fonte
Há uma resposta ainda mais simples:
cd dontDeleteMe
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
fonte
cd dontDeleteMe && rm -rf *
&&
operador não apenas encadeia os comandos; requer que cada comando seja bem-sucedido antes que o próximo seja executado. Se ocd
comando falhar por qualquer motivo (o diretório não existe, privilégios, etc.), orm
comando não será executado. Eu chamaria isso de mais seguro.fonte
rm -rf *
mesmo assim.limpará o diretório de trabalho atual
fonte