No Unix, como você remove tudo no diretório atual e abaixo dele?

Respostas:

166

Pratique computação segura. Basta subir um nível na hierarquia e não usar uma expressão curinga:

cd ..; rm -rf -- <dir-to-remove>

Os dois travessões --indicam rmque <dir-to-remove>não é uma opção de linha de comando, mesmo quando começa com um travessão.

Tvanfosson
fonte
8
Por que isso é mais seguro?
Iene
34
Porque você está correspondendo especificamente a um diretório nomeado e, portanto, é menos provável que exclua algo que não pretende excluir.
tvanfosson
5
Verdade. Eu poderia me ver fazendo isso facilmente.
Iene
26
não apaga o próprio diretório também? Você tem que fazer mkdir <dir-to-remove> depois. Mas, então, qualquer hardlink referindo-se a esse diretório será um diretório distinto posteriormente.
Johannes Schaub - litb
5
@Yen, se você usar, rm ./pode digitar acidentalmente, o rm . /que pode ser um desastre.
irfandar
44

Irá deletar todos os arquivos / diretórios abaixo do atual.

find -mindepth 1 -delete

Se você quiser fazer o mesmo com outro diretório cujo nome você tem, basta nomear esse

find <name-of-directory> -mindepth 1 -delete

Se você deseja remover não apenas os subdiretórios e arquivos, mas também o próprio diretório, omita -mindepth 1. Faça isso sem o -deletepara obter uma lista das coisas que serão removidas.

Johannes Schaub - litb
fonte
Eu precisava excluir todos os arquivos nos subdiretórios, mas não queria excluir os próprios subdiretórios. find <name-of-direcotry> -mindepth 2 -delete funcionou muito bem!
Tim Dearborn de
Você precisa -mindepth 1se estiver especificando um diretório ( find <name-of-directory> -mindepth 1 -delete). Caso contrário, Johannes está certo, ele não excluirá o diretório de trabalho atual (ao usar find -delete).
Weboide
IMO, esta é a melhor resposta, principalmente em scripts.
wizonesolutions
1
Eu tentei: find -mindepth 1 -deletemas consegui, illegal option -- mmas funcionou muito bem quando removi a opção mindepth find . -delete
sharon
41

O que eu sempre faço é digitar

rm -rf *

e então pressione ESC- * , e o bash irá expandir o * para uma lista explícita de arquivos e diretórios no diretório de trabalho atual.

Os benefícios são:

  • Posso revisar a lista de arquivos a serem excluídos antes de pressionar ENTER.
  • O histórico de comandos não conterá "rm -rf *" com o curinga intacto, que pode ser reutilizado acidentalmente no lugar errado na hora errada. Em vez disso, o histórico de comandos terá os nomes reais dos arquivos.
  • Também foi útil responder uma ou duas vezes "espere um segundo ... quais arquivos eu acabei de excluir?". Os nomes dos arquivos são visíveis no buffer de rolagem do terminal ou no histórico de comandos.

Na verdade, gosto tanto disso que tornei o comportamento padrão para TAB com esta linha em .bashrc:

bind TAB:insert-completions
Ville Laurikari
fonte
Faltando --nesta resposta? Essa abordagem é incrível no geral, devo dizer.
Ben Voigt
a melhor maneira é executar isso com sudo
Abbas Torabi
22

Usar

rm -rf *

Update: O .significa diretório atual, mas não podemos usar isso. O comando parece ter verificações explícitas para .e ... Em vez disso, use o caractere curinga. Mas isso pode ser arriscado.

Uma versão mais segura do IMO é usar:

rm -ri * 

(isso solicita uma confirmação antes de excluir todos os arquivos / diretórios.)

diretamente
fonte
13
"Pode ser arriscado" é maravilhosamente lacônico.
5
Ao fazer coisas assim, descobri um rápido ls -r. primeiro permite que você veja o que você vai deletar. Útil para dar uma ideia rápida de que você não vai deletar todo o disco ...
Rich Bradshaw
2
Por que é mais arriscado do que rm -rf <subdir-name>?
Iene
2
@Yen - porque se você fizer isso no lugar errado, poderá obter resultados desastrosos. Usar um nome específico no lugar errado só pode dar errado se o mesmo subdiretório existir lá.
tvanfosson
1
Você não pode excluir o pai enquanto morava com o filho.
diretamente
6

É correto rm –rf .remover tudo no atual diretamente, incluindo quaisquer subdiretórios e seu conteúdo. O único ponto ( .) significa o diretório atual. tome cuidado para não fazer isso, rm -rf ..pois o ponto duplo ( ..) significa o diretório anterior.

Dito isso, se você é como eu e tem várias janelas de terminal abertas ao mesmo tempo, é melhor estar seguro e usar rm -ir .Vejamos os argumentos do comando para entender o porquê.

Primeiro, se você olhar a rmpágina do manual do comando ( man rmna maioria dos Unix), você notará que –rsignifica "remover o conteúdo dos diretórios recursivamente". Então, fazer rm -r .sozinho excluiria tudo no diretório atual e tudo abaixo dele.

No rm –rf .adicionado -f significa "ignorar arquivos inexistentes, nunca solicitar". Esse comando exclui todos os arquivos e diretórios no diretório atual e nunca solicita que você confirme se realmente deseja fazer isso. -fé particularmente perigoso se você executar o comando com um usuário com privilégios, já que pode excluir o conteúdo de qualquer diretório sem ter a chance de ter certeza de que é realmente o que deseja.

Por outro lado, rm -ri .no -ique substitui os -fmeios "prompt antes de qualquer remoção". Isso significa que você terá a chance de dizer "ops! Não é isso que eu quero" antes que o rm exclua todos os seus arquivos.

Em meus primeiros dias de administrador de sistemas, eu fiz um rm -rf /em um sistema enquanto estava conectado com todos os privilégios (root). O resultado foi dois dias passados ​​restaurando o sistema dos backups. É por isso que agora emprego rm -ri.

Pierre-Luc Simard
fonte
6

E se:

rm -rf "$(pwd -P)"/* 

fonte
27
jQuery é tão poderoso.
Pawel
5
rm  -rf * 

Não faça isso! É perigoso! VERIFIQUE SE VOCÊ ESTÁ NO DIRETÓRIO CERTO!

nkassis
fonte
4

certifique - se de que está no diretório correto

rm -rf *
digitaljoel
fonte
2
Isso não exclui arquivos ou subdiretórios cujos nomes começam com um ponto.
1
verdade. em meus testes, nem rm -rf. tvanfosson tem a melhor solução IMO com seu "cd ..; rm -rf <dir-to-remove>"
digitaljoel
2

Esta solução segura e geral mais simples é provavelmente:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
Devnev
fonte
1

Acredito que esta resposta seja melhor:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Se seu diretório de nível superior for chamado images, execute rm -r images/*. Isso usa o operador shell glob *para executar rm -rem cada arquivo ou diretório dentro de imagens.

basicamente você sobe um nível e, em seguida, diz delete tudo dentro do diretório X. Desta forma, você ainda está especificando qual pasta deve ter seu conteúdo excluído, o que é mais seguro do que apenas dizer 'exclua tudo aqui ", enquanto preserva a pasta original, (que às vezes você deseja porque não tem permissão ou simplesmente não quer para modificar as permissões existentes da pasta)

Francisco noriega
fonte