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
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?
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
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/**/*(.)
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 '{}' \;
Tags command-line rm