各メールユーザーのアカウントに.spamフォルダを作成します。

各メールユーザーのアカウントに.spamフォルダを作成します。

私の前の質問、cronジョブを使用したメールフォルダのクリーンアップ私に役立つほど十分な回答を得られませんでした。私は次のように作業範囲を狭めました。

.spam/cur夜のcron操作で、すべてのユーザーと.spam/newフォルダのメッセージをスパムチュートリアルフォルダに移動したいと思います。そこで処理され削除されます。

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

上記の行は、フォルダがない場合にエラーを生成します。例えば、

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

ユーザー用のフォルダがない場合は作成してくれれば役に立つと思いますので、存在しない場合はtouch作成に活用することも検討中です。

Q1:次の方法は十分に強力ですか?

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:フォルダが空であっても移動コマンドは正しく機能しますか?

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

Q3:よりスマートな方法がありますか?


アップデート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

これはうまくいきます。 {cur,new} 構文の使用に問題があるようです。

これで、ユーザーはスパムを.spamフォルダに配置します。 cronジョブはそれを.sa-learnフォルダに移動し、sa-learnに供給してフォルダを削除します。

答え1

次の目的では、をtouch使用してディレクトリを作成することはできません。mkdir

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

この-pフラグは、mkdir中間フォルダが存在しない場合はすべての中間フォルダを作成するように指示し、既存のフォルダを作成しようとするとエラーは発生しません。

これは、シェルが拡張のために強化できると仮定します。そうでない場合は、3回の別々の呼び出しに分割しますmkdir

メールを移動するとき(テストされていません):

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

.spamその後、下のフォルダにあるすべてのメッセージ(新しいメッセージまたは既存のメッセージ)を見つけてそのフォルダ$HOME/mailに移動します。.sa-learn/new

"$HOME"スクリプトで代わりに使用する~理由は、よりよく、自己文書化され、他の変数のように動作するためです(~何もありません)。

関連情報