Maneira apropriada de excluir o conteúdo do diretório [duplicado]

6

Qual é a maneira correta de excluir all o conteúdo de um diretório, sem o diretório mencionado?
Por exemplo, tenho a seguinte estrutura de diretórios:

foo/
    bar1/
    bar2/
    x.txt

Desejo excluir as pastas bar1 e bar2 e o arquivo x.txt , sem excluir foo .

Considere também nomes de arquivos com caracteres especiais que podem ser ignorados ou gerar um erro.

Editar # 1 (30 de setembro, 18:26 UTC):
Eu acho que a minha pergunta não é uma duplicata de esta questão , porque pedi para excluir tudo dentro de um diretório, enquanto a outra não e as respostas não incluíam tal solução.

    
por Dor 27.09.2013 / 15:27

1 resposta

9

Se você souber o diretório que pode usar usando um destes comandos:

$ find foo/* -delete

$ rm -fr foo/*

$ find foo/* -exec rm -fr {} +

Se você tiver arquivos que começam com um ponto ( . ), você precisará de uma versão modificada de rm .

$ rm -fr foo/{*,.*}

Exemplo

$ ls -l foo
drwxrwxr-x    6 saml saml  4096 Sep 27 09:43 .
drwx------. 263 saml saml 32768 Sep 27 09:42 ..
drwxrwxr-x    2 saml saml  4096 Sep 27 09:43 dir1
drwxrwxr-x    2 saml saml  4096 Sep 27 09:43 dir2
drwxrwxr-x    2 saml saml  4096 Sep 27 09:43 dir space1
drwxrwxr-x    2 saml saml  4096 Sep 27 09:43 dir space2
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 .dot space1
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 .dot space2
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 file1
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 file2
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 file space1
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 file space2

$ rm -fr foo/{*,.*}
rm: cannot remove directory: 'adir/.'
rm: cannot remove directory: 'adir/..'
$

$ ls -l foo/
total 0
$

Repetindo com um novo diretório de arquivos:

$ find foo/* -delete
$

Lidando com caracteres especiais

Se você tiver um diretório chamado foo tastic que tenha um espaço, pode citá-lo, mas ainda usar um curinga:

Exemplo

$ rm -fr "foo tastic"/*

Caracteres Especiais

Frequentemente usarei esse truque para ver o que o shell pensa das minhas misturas de nome de arquivo antes de executá-las. No diretório de amostra que usei acima:

$ ls -1 "arquivo" * espaço de arquivo1 espaço de arquivo2

$ ls -1d "dir" * espaço dir1 espaço dir2

Ao fazer esses testes antes, você pode ter uma noção de quais arquivos / diretórios estarão em jogo quando um comando contendo o glob for usado.

    
por 27.09.2013 / 15:29