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

21

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

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

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

    
por PKM 20.11.2016 / 02:14

3 respostas

34

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
    
por Sergiy Kolodyazhnyy 20.11.2016 / 02:17
13

com bash :

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

Aqui iterando sobre os nomes de arquivos expandidos glob e removendo apenas arquivos.

O exemplo acima é de execução a seco, se estiver satisfeito com as alterações a serem feitas, remova echo para a remoção real:

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

Por fim, desmarque globstar :

shopt -u globstar

Com zsh , aproveitando o qualificador glob:

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

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

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

rm -- FOLDER/**/*(.)
    
por heemayl 20.11.2016 / 04:55
12

Se a sua versão de find não suportar -delete , você poderá usar o seguinte para excluir todos os arquivos no diretório atual e abaixo.

find . ! -type d -exec rm '{}' \;
    
por bc2946088 20.11.2016 / 02:19