Como simplesmente remover tudo de um diretório no Linux

4

Como simplesmente remover tudo de um diretório atual ou especificado no Linux?

Várias abordagens:

  1. rm -fr * a rm -fr dirname/*
    Não funciona - ele deixará arquivos ocultos - os que começam com um ponto e os arquivos começam com um traço no diretório atual e não funcionarão com muitos arquivos

  2. rm -fr -- * a rm -fr -- dirname/*
    Não funciona - ele deixará arquivos ocultos e não funcionará com muitos arquivos

  3. rm -fr -- * .*
    rm -fr -- dirname/* dirname/.*
    Não tente isto - ele também removerá um diretório pai, porque ".." também começa com ". "

  4. rm -fr * .??* a rm -fr dirname/* dirname/.??*
    Não funciona - ele deixará arquivos como ".a", ".b" etc. e não funcionará com muitos arquivos

  5. find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -fr a find dirname -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -fr
    Tanto quanto eu sei correto, mas não é simples.

  6. find -delete a find dirname -delete
    AFAIK correto para o diretório atual, mas usado com o diretório especificado, também excluirá esse diretório.

  7. find -mindepth 1 -delete a find dirname -mindeph 1 -delete
    AFAIK correto, mas é a maneira mais simples?

por Tometzky 19.08.2009 / 13:27

5 respostas

8

rm -fr * .*
Funcionará bem com pelo menos o GNU rm, pois possui um código especial para excluir "." e ".."

$ id
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
$ cd /tmp
$ mkdir rmtest
$ cd rmtest
$ touch .test
$ ls -la
total 8
drwxr-xr-x 2 nobody nogroup 4096 2009-08-19 15:37 .
drwxrwxrwt 7 root   root    4096 2009-08-19 15:37 ..
-rw-r--r-- 1 nobody nogroup    0 2009-08-19 15:37 .test
$ rm -rf .*
rm: cannot remove '.' or '..'
rm: cannot remove '.' or '..'
$ ls -la
total 8
drwxr-xr-x 2 nobody nogroup 4096 2009-08-19 15:37 .
drwxrwxrwt 7 root   root    4096 2009-08-19 15:37 ..
$

link

A página man do FreeBSD rm diz "É um erro tentar remover os arquivos /,. ou ..", então provavelmente também funcionará lá se você especificar o sinalizador de força para ignorar o erro.

link

    
por 19.08.2009 / 15:43
6

Para adicionar à sua lista, digamos que você queira apagar tudo no diretório foo e todos os subdiretórios (é o que o seu comando find faz). Eu sempre achei que o mais simples era:

#for dir foo with /home/kbrandt/foo
rm -rf /home/kbrandt/foo && mkdir /home/kbrandt/foo

Se você não quiser excluir os subdiretórios, modifique seu comando find para incluir -type f

    
por 19.08.2009 / 13:34
4
 rm -rf directory

Isso vai efetivamente neutralizar tudo, incluindo o próprio diretório.

    
por 19.08.2009 / 13:38
1

Por que não um simples

ls -la <selected dir>| xargs rm -Rf

?

Isso gerará erros para "." & ".." mas vai largar todo o resto.

    
por 25.09.2009 / 12:33
1

Aqui está algo que apenas funcionou para mim:

zip -rm foo *
rm foo.zip

Pode não ser o método mais eficiente, mas funcionou.

    
por 18.01.2013 / 15:59