Qual é o comando para remover todos os arquivos, mas não os diretórios?

23

Digamos que eu tenho uma árvore de diretórios como esta:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Se eu usasse rm -r FOLDER/*, tudo em FOLDER seria excluído, incluindo subdiretórios. Como posso excluir todos os arquivos na pasta e em seus subdiretórios sem excluir os diretórios reais?

PKM
fonte

Respostas:

37

O que você está tentando fazer é a exclusão recursiva. Para isso, você precisa de uma ferramenta recursiva, como find.

find FOLDER -type f -delete
Sergiy Kolodyazhnyy
fonte
13

Com bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Aqui, a iteração sobre a glob expandiu os nomes de arquivos e remove apenas os arquivos.

O acima é executado a seco, se estiver satisfeito com as alterações a serem feitas, remova echopara remoção real:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Finalmente, desative globstar:

shopt -u globstar

Com zsh, aproveitando o qualificador glob:

echo -- FOLDER/**/*(.)

(.) é um qualificador glob, que limita as expansões glob a apenas arquivos regulares.

O texto acima apenas imprimirá os nomes dos arquivos, para remoção real:

rm -- FOLDER/**/*(.)
heemail
fonte
2
+1 para zsh globbing. Mais pessoas devem estar cientes das coisas impressionantes que o zsh pode fazer.
marcelm
11

Se a sua versão do findnão suportar, -deletevocê pode usar o seguinte para excluir todos os arquivos no diretório atual e abaixo.

find . ! -type d -exec rm '{}' \;

fonte
-exec rm {} +seria mais rápido, especialmente se houver muitos arquivos.
Muru
E find . ! -type d -exec rm {} +remove links sym também.
Justiça para Monica
1
@ muru: Se uma implementação específica de findnão suporta -delete, provavelmente também não suporta -exec ... {} +. A maneira recomendada de lidar com isso é find ... -print0 | xargs -r0 rm(se alguém espera muitas correspondências em potencial).
David Foerster
5
@DavidFoerster não realmente. -exec ... {} +é POSIX, mas -deletenão é. (Nem é -print0, a propósito.) #
Muru
@muru: Justo o suficiente. Encontrei pelo menos duas findimplementações que não são POSIX suportadas, -print0mas não -exec ... {} +(não me lembro disso -delete). Um estava no OS X, o outro no Solaris (alguns anos atrás, em um sistema atualizado de maneira muito conservadora). Você também pode substituir -print0com -printf '%p\0'. Enfim, este é o Ask Ubuntu e não o Unix e Linux, e o Ubuntu usa o GNU find desde sempre.
David Foerster