Criando pastas .spam na conta de cada usuário de email

0

Minha pergunta anterior, Limpando pastas de e-mail com a tarefa Cron não resultou em uma resposta boa o suficiente para me ajudar. Eu reduzi a tarefa da seguinte forma:

Desejo mover o e-mail das pastas .spam/cur e .spam/new de cada usuário para a pasta de ensino de spam (por tarefa do cron noturno). Lá eles serão processados e excluídos.

mv ~/mail/*/*/.spam/{cur,new}/* ~/mail/.sa-learn

A linha acima gera um erro se a pasta não existir. por exemplo,

+-- mail
  +-- sitename.com
    +-- username1
    | +-- .spam
    |   +-- cur
    |   +-- new
    +-- username2   <-- no ".spam" folder.
    +-- username3
    | +-- .spam
    |   +-- cur
    |   +-- new

Como seria útil criar as pastas para os usuários, se elas não existem, estou pensando em usar touch para criá-las, se elas não existirem.

Q1: A abordagem a seguir é suficientemente robusta?

for dir in ~/mail/*/*/; do touch "$dir/.spam"; done
for dir in ~/mail/*/*/.spam/; do touch "$dir/cur"; done
for dir in ~/mail/*/*/.spam/; do touch "$dir/new"; done

Q2: O comando mover agora funciona sem erros, mesmo que as pastas estejam vazias?

mv ~/mail/*/*/.spam/{cur,new}/* ~/mail/.sa-learn

Q3: Existe uma maneira mais inteligente de fazer isso?

Atualização 4

#!/bin/bash
# SpamAssassin Learn script.
# With help from Kusalananda's answer 
# to https://unix.stackexchange.com/questions/336412/creating-spam-folders-in-each-mail-users-account
#
# Any mail the user drops into their spam folder will be moved to a temp folder,
# fed to SpamAssassin's sa-learn and then deleted.
# The script also creates the .spam folders for each account if they don't already exist.
# Run daily as a cron task.

myDomain=sitename.com

# Create .spam/, .spam/cur/ and .spam/new/ folders for each user.
#mkdir -p "$HOME"/mail/"$myDomain"/*/.spam/{cur,new}
for userdir in "$HOME"/mail/"$myDomain"/*; do test -d "$userdir" && mkdir -p "$userdir"/.spam/cur; done
for userdir in "$HOME"/mail/"$myDomain"/*; do test -d "$userdir" && mkdir -p "$userdir"/.spam/new; done

# Create a temp folder.
mkdir -p "$HOME"/mail/.sa-learn/ 

# Find all the .spam emails and move them to the temp folder.
# IMAP users should see their spam folder empty.
find "$HOME"/mail/"$myDomain" -type f -path "*/.spam/cur/*" -print0 | xargs -0 -I XX mv "XX" "$HOME"/mail/.sa-learn/
find "$HOME"/mail/"$myDomain" -type f -path "*/.spam/new/*" -print0 | xargs -0 -I XX mv "XX" "$HOME"/mail/.sa-learn/

# Feed the emails into the SpamAssassin spam learner.
sa-learn -p ~/.spamassassin/user_prefs --spam "$HOME"/mail/.sa-learn

# Remove the temporary folder and its contents.
rm -rf "$HOME"/mail/.sa-learn

Isso funciona. Parece que estou tendo problemas com a sintaxe {cur, new}.

O usuário agora envia spam para a pasta .spam. O trabalho Cron os move para a pasta .sa-learn, alimenta-os para sa-learn e, em seguida, exclui a pasta.

    
por Transistor 10.01.2017 / 21:34

1 resposta

3

Você não pode criar um diretório com touch , use mkdir para isso:

mkdir -p "$HOME"/mail/.sa-learn/{cur,new,tmp}

O -p sinalizador diz mkdir para criar todas as pastas intermediárias, se elas não existirem, e não é um erro tentar criar uma pasta que já existe.

Isso está assumindo um shell que suporta a expansão. Se isso não acontecer, divida-o em três invocações mkdir separadas.

Ao mover e-mails (não testados):

find "$HOME"/mail -type f -path "*/.spam/*" -print0 |
xargs -0 -I XX mv "XX" "$HOME"/mail/.sa-learn/new/

Isso localizará todos os e-mails (novos ou antigos) em qualquer pasta .spam em $HOME/mail e os moverá para a pasta .sa-learn/new .

Estou usando "$HOME" em vez de ~ em scripts porque acho que é mais legal, é autodocumentável e se comporta como qualquer outra variável ( ~ não).

    
por 10.01.2017 / 22:32