Como remover todos os arquivos de um diretório?

289

O mais próximo que cheguei é

# rm /path/to/directory/*.*

mas isso não funciona para arquivos que não têm extensão ...

user784637
fonte

Respostas:

340

O Linux não usa extensões. Cabe ao criador do arquivo decidir se ele deseja que o nome tenha uma extensão. O Linux analisa o primeiro byte para descobrir com que tipo de arquivo ele está lidando.

Para remover tudo em um diretório, use:

rm /path/to/directory/*

Você pode usar a -ropção, por exemplo:

rm -r /path/to/directory/*

para remover também qualquer subdiretório (junto com todo o seu conteúdo) dentro do diretório do qual você está removendo. Caso contrário, ele mostrará um erro informando que você não está removendo o diretório.

Rinzwind
fonte
13
Se você também deseja excluir arquivos ocultos executar shopt -s dotglobantes de executarrm (...)
danjjl
7
O * significa all files;) *.*significa todos os arquivos que contêm um .lugar no nome
Rinzwind 6/11
10
@Rinzwind, com mais precisão, o asterisco significa "zero ou mais de qualquer caractere". Isso *a*significa zero ou mais caracteres, aseguido por zero ou mais caracteres. Ele iria coincidir com os nomes de arquivos happy, apple, aou la.
usar o seguinte
7
@ user784637 você está muito facilmente impressionado
barlop
1
Aqui está o comando que você deseja: rm - *
anon58192932 10/10
168
  • Para remover a pasta com todo o seu conteúdo ( incluindo todas as pastas internas ):

    rm -rf /path/to/directory
    
  • Para remover todo o conteúdo da pasta ( incluindo todas as pastas internas ), mas não a própria pasta:

    rm -rf /path/to/directory/*
    

    ou

    rm -rf /path/to/directory/{*,.*}
    

    se você quiser garantir que arquivos / diretórios ocultos também sejam removidos.

  • Para remover todos os "arquivos" de dentro de uma pasta ( sem remover as pastas internas ):

    rm -f /path/to/directory/{*,.*}
    


  • Aviso : se você tiver espaços em seu caminho, sempre use aspas.

    rm -rf /path/to the/directory/*
    

    é equivalente a 2 rm -rfchamadas separadas :

    rm -rf /path/to
    rm -rf the/directory/*
    

    Para evitar esse problema, você pode usar 'aspas simples '( não expande variáveis ​​de shell) ou "aspas duplas "( expande variáveis ​​de shell):

    rm -rf "/path/to the/directory/"*
    


Onde:

  • rm- significa " remover "
  • -f- significa " force ", que é útil quando você não deseja ser solicitado / solicitado se deseja remover um arquivo, por exemplo.
  • -r- significa " recursivo ", o que significa que você deseja descer recursivamente todas as pastas e remover tudo.
Lilian A. Moraru
fonte
8
Achei que essa era a resposta mais abrangente e útil, além da resposta marcada como Aceita.
Inspirado em
2
rm -rf /path/to/directory/*não remove um arquivo oculto na pasta, por exemplo .htaccess. Talvez rm -rf /path/to/directory/.? Ainda não tentei.
Mark Berry
@MarkBerry rm -rf /path/to/directory/.*
Lilian A. Moraru
@ LilianA.Moraru, fiz alguns testes hoje. rm -rf /path/to/directory/.*exclui apenas os arquivos ocultos no diretório especificado. Observando o comentário de @ danjjl na resposta de @ Rinzwind, também para excluir arquivos ocultos, execute shopt -s dotglobantes de executar rm -rf /path/to/directory/*.
Mark Berry
CUIDADO: rm -rf /path/to/directory/.*no meu sistema causou a exclusão de itens no /path/to. Felizmente, eu tinha acabado de fazer backup de todos os meus dados em um disco separado. Escusado será dizer que NÃO emita o comando, a rm -rf /path/to/directory/.*menos que você tenha feito backup de todo o computador em um local separado / seguro!
lawlist
43

Para remover todos os arquivos no diretório (incluindo arquivos ocultos e subdiretórios), execute:

rm -rf /path/to/directory/{*,.*}
Leonid V. Fedorenchik
fonte
1
Essa deve ser a bela resposta aceita. Obrigado!
Nam G VU
3
Este glob não corresponde a "." e também?
Hertzsprung
4
@hertzsprung - sim, e você receberá um aviso de que não pode excluir ./e ../, mas ainda excluirá os arquivos ocultos.
Ryan Wheale
Isso não funciona no console do Mac, os arquivos ocultos ainda estão lá com essa linha de comando.
Agapitocandemor
Para remover tudo o diretório atual:rm -r $(pwd)/{*,.*}
Jimmy Adaro
10

Se você deseja excluir apenas arquivos no diretório / path / to /, você pode

find /path/to/directory -type f -print0| xargs -0 rm 

ou

find /path/to/directory -type f -exec rm '{}' \;

Você pode fazer cargas com find, a vantagem é que você pode listar o que é encontrado sem direcioná-lo para rmque você possa ver o que será excluído antes de começar.

Richard Holloway
fonte
2
GNU findcomo um -deletepredicado. Se você ainda deseja usar -exec, a substituição \;por +reunirá as rmchamadas, aumentando a eficiência.
enzotib 6/09/11
1
uma grande quantidade de arquivos com '+' causará problemas, pois a lista será muito grande, igual a rm -f *. e ao remover grandes quantidades de arquivos da mesma pasta (falando em milhões), ambos não são bons :) No final, o C ++ apareceu e removeu arquivos na ordem dos inodes na árvore de diretórios.
Osis
3
Você realmente deve adicionar um - depois da empresa. Sem isso, se você tiver um nome de arquivo, -rf ou similar será interpretado como argumento para rm. por exemplo, xargs -0 rm - ou -exec rm - {} \;
Richm
você também pode fornecer o argumento -n para xargs. Isso fará com que ele divida os comandos rm para ter um número máximo de argumentos, ou seja, 'xargs -n 100 -0 rm -' removerá arquivos em pedaços de 100.
Richm
1
Você também pode adicionar -maxdepth 1 para garantir que a localização não retorne arquivos de nenhum subdiretório. ou seja, find / path / to / directory -maxdepth 1 -type f
Richm
7

Para excluir todos os arquivos e diretórios (incluindo os ocultos ) em um diretório, você pode tentar o seguinte:

  • exclua a pasta e recrie-a

    rm -rf dir_name && mkdir dir_name
    
  • usar find

    find dir_name -mindepth 1 -delete  
    

Aqui, especificamos -mindepth 1para excluir o diretório dir_name em si.
Dê uma olhada no seguinte link:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

zeekvfu
fonte
Obrigado pelo seu conselho e eu adicionei mais explicações para os links.
Zeekvfu 28/11
3
Cuidado, pois excluir e recriar a pasta pode resultar em permissões diferentes / incorretas para essa pasta!
einjohn
6

Se você também deseja remover todos os subdiretórios e o próprio diretório, pode usar rm -rf /path/to/directory. Mas sempre verifique sua linha antes de pressionar return, também rm -rfpode causar muitos problemas, por exemplo, se você inserir acidentalmente um espaço após a primeira barra com permissões de superusuário ...

Tobias Kienzler
fonte
1

Como essa pergunta está constantemente no topo do Google, quando eu procuro por mim mesma:

As outras respostas sofrem de diferentes problemas:

  1. Alguns deles incluem .e ..que é barulhento, confuso e irritante.

  2. Alguns deles esquecem arquivos ocultos (arquivos começando com um ponto).

  3. Eles não são excluídos na ordem correta (mais profunda) para permitir a exclusão do diretório.

  4. Eles descem para outros sistemas de arquivos (montados), o que geralmente é indesejável.

  5. Eles são difíceis de estender corretamente com parâmetros extras (mais sobre isso abaixo).

Portanto, para excluir RECURSIVAMENTE todos os arquivos E pastas em um diretório, faça o seguinte:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Observe que eu adicionei um -xdevargumento para impedir a descida para montagens (como /procetc.).

Por que não -depthou -delete?

Apesar de as pessoas me recusarem constantemente por isso, esses métodos têm uma desvantagem: não parece extensível o suficiente para permitir -pruneum subdiretório (sem introduzir mais problemas). Em contraste com esse método, você pode inserir

-not \( -path "${DIR}/subdir" -prune \)

antes do -mindepthargumento para excluir subdiro conteúdo excluído.

Mehrdad
fonte
E para a ordem de profundidade, há uma -depthbandeira findpara isso.
Sergiy Kolodyazhnyy
Uh ... por que não usar apenas -deletecomfind ? -deleteé profundidade primeiro. Você já está assumindo não-POSIX findcom o -printf, então você poderia muito bem usar -deleteou-depth -print0 | xargs -0 rm
Muru
@uru: Porque eu não conhecia melhor ... vou mudar isso.
Mehrdad
@ muru: Na verdade, parece que seu método não funciona -not \( -path "$DIR/subdir" \)... mas o meu funciona? Por quê?
Mehrdad
@Mehrdad, o que isso deve fazer?
muru 21/05/19
0

Você pode cdentrar no diretório e executar o comando rm *.*como no DOS, se lembrar.

VK Mavani
fonte
1
O DOS é DEL para arquivos e o RMDIR para diretórios esvaziados - e os arquivos ocultos e do sistema devem ter esses atributos ATTRIB removidos primeiro. Não é tão simples assim;)
Eric
0

Para excluir o diretório atual, você pode, por exemplo, usar rm -d ./*

-d diz para excluir diretórios também.

arviman
fonte