Como remover todos os arquivos em um diretório?


76

Estou tentando remover todos os arquivos e subdiretórios em um diretório. Eu costumava rm -rremover todos os arquivos, mas quero remover todos os arquivos e subdiretórios, excluindo o próprio diretório superior.

Por exemplo, eu tenho um diretório superior como images. Ele contém os arquivos header.png, footer.pnge um subdiretório.

Agora eu quero excluir header.png, footer.pnge o subdiretório, mas não images.

Como posso fazer isso no linux?


1
CD no diretório e faça um rm -Rfde todos os arquivos e diretórios nele.
Noufal Ibrahim

Respostas:


59

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 images.


30
arquivo oculto não será excluído.
reto

51

Para excluir arquivos ocultos, você deve especificar:

rm -r images/* images/.*

Com conchas, cuja globs incluem .e .., isso vai levar a um erro como

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

mas ele excluirá arquivos ocultos.

Uma abordagem sem mensagem de erro é usar a localização / exclusão com mindepth. Isso é gnu-find.

find images -mindepth 1 -delete

Sua descoberta pode não ter o -mindepthou -deletepredicado; nesse caso, você pode:

find images/. ! -name . -prune -exec rm -rf {} +

Minha sugestão foi usar 'rm -r images /.*', que corresponderia a 'images / ..', mas não 'images /../ ..'. A recursão não pode subir, pois 'images /../ images / ..' é novamente o mesmo diretório.
usuário desconhecido

4
@DarkHeart rm .*não exclui .ou ..e não tem, pelo menos desde 1994 para os utils GNU e provavelmente desde o final dos anos 70 para UNIX . É extremamente improvável que você encontre um sistema que rm .*atravesse o sistema de arquivos para cima, fora de um museu.
terdon

21

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

  • use ls -Abpara corresponder a todos os arquivos / diretórios

    cd dir_name && rm -rf `ls -Ab`
    
  • use findpara corresponder a todos os arquivos / diretórios

    find dir_name -mindepth 1 -delete
    

    ou, se o seu findnão suportar -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • exclua a pasta e recrie-a

    rm -rf dir_name && mkdir dir_name
    
  • na festança,

    shopt -s dotglob  
    rm -rf dir_name/*
    

Note-se que comando como rm -rf *não é seguro se você não tem conhecimento de arquivos em um diretório, porque um arquivo começando com -(hífen) será interpretado como rmbandeira ...
VasyaNovikov

1
EDIT: para fazê-lo seguro, usorm -rf ./* ./.*
VasyaNovikov

9

Para excluir todos os arquivos regulares recursivamente dentro de um diretório, este comando (assumindo GNU ou FreeBSD find) é bom o suficiente:

find . -type f -delete

Isso deixa todos os arquivos não regulares, como links simbólicos (se eles apontam para arquivos regulares ou não), diretórios, fifos, soquetes, dispositivos ...

Veja também:

find . ! -type d -delete

para excluir arquivos de qualquer tipo, exceto diretório .



3

Estou usando o findcomando aqui:

Etapa 1: encontre todos os arquivos e exclua-os:

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

Exemplo:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Etapa 2: encontre todos os subdiretórios e exclua-os:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type dinclui .isso excluirá o próprio diretório. Você também deve usar o -mindepthinterruptor como já foi dito.
Arthur Tacca 31/01

3

A questão era esvaziar um diretório = remover o conteúdo de um diretório, incluindo arquivos ocultos, mas não o próprio diretório. O comando find com -mindepth 1 é realmente o caminho correto a seguir, mas para evitar mensagens de erro, ele deve ser associado a -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

0

A sintaxe da rm é:

rm [OPTION]... FILE...

Portanto, você deve declarar explicitamente o caminho apropriado, por exemplo

rm -r sub_dir/

0

Você pode remover o diretório usando o seguinte comando:

sudo rm -r directoryname1/2/3/*

Será excluído o diretório inteiro após 3 / *.

Exemplo sudo rm -r Downloads / música / *

Ele excluirá todos os arquivos que estão dentro Downloads/song.


0

Isso funciona perfeitamente para mim, testou várias variações trabalhadas todas as vezes.

No diretório que contém o diretório de imagens.

rm -frd ./images/*

antes:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

depois de:

images/

Não tenho certeza se foi esclarecido na pergunta original, mas apenas para salientar que, a menos que você ative o dotglob, isso ignorará qualquer "arquivo de pontos" ou diretório de pontos em imagens ( mkdir images/.somedir; touch images/.somefile)
Jeff Schaller

0

Para excluir todos os arquivos e subdiretórios do diretório atual, incluindo os ocultos, sem mensagem de erro :

rm -rf .[^.] .??* *

Ou, no diretório pai:

rm -rf images/.[^.] images/.??* images/*

De https://serverfault.com/a/47940/269538 .



-2

Exclua a pasta "test" e todos os arquivos dentro:

 rm -r test

Exclua todos os arquivos internos, mas mantenha a pasta "test":

 rm -r test/*

-4

cd na pasta e execute o seguinte comando:

ls |xargs rm -rf

2
Isso falhará nos nomes de arquivos que contêm espaços em branco. Eu recomendaria não usar a saída de ls como entrada para outros comandos, geralmente é inseguro.
dhag
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.