Remove tudo dentro do diretório usando loop

1

Estou tentando remover uma grande quantidade de e-mails (principalmente falha na entrega de e-mails) do meu servidor usando

 rm -rf /home/*/mail/new/*

E estou recebendo -bash: /usr/bin/rm: Argument list too long

Eu tentei usar o find

find /home/*/mail/new/ -mindepth 1 -delete

Mas depois de 20 minutos, parece que não está fazendo nada.

Como eu uso o loop para excluir tudo (diretórios, arquivos, arquivos de ponto) dentro de /home/*/mail/new/

Algo parecido com isto

for f in /home/*/mail/new/*.*~; do
        # if it is a file, delete it
    if [  -f $f ]
    then
        rm "$f"
    fi
done

Por favor, ajude-me a reescrever este comando para excluir arquivos e pastas e tudo dentro de /home/*/mail/new/

EDITAR: Minha pergunta é única porque é sobre fazer isso no loop FOR.

    
por Luka 28.02.2017 / 20:39

1 resposta

3

O problema é que /home/*/mail/new/* se expande para muitos nomes de arquivos. A solução mais simples é excluir o diretório:

rm -rf /home/*/mail/new/

Como alternativa, use seu comando find . Deve funcionar, será apenas mais lento.

Ou, se você precisar que os diretórios new usem um loop para localizá-los, exclua-os e recrie-os:

for d in /home/*/mail/new/; do
    rm -rf "$d" && mkdir "$d"
done

O loop que você estava tentando escrever (mas não use isso, é muito lento e ineficiente) é algo como:

for f in /home/*/mail/new/* /home/*/mail/new/.*; do
    rm -rf "$f"
done

Não é necessário testar arquivos se você quiser excluir tudo, basta usar rm -rf e os diretórios e arquivos podem ser excluídos pelo mesmo comando. Ele vai reclamar sobre não ser possível deletar . e .. , mas você pode ignorar isso. Ou, se você quer ser super clean e evitar os erros, você pode fazer isso no bash:

shopt -s dotglob
for f in /home/*/mail/new/*; do
        rm -rf "$f"
done
    
por 28.02.2017 / 20:53