각 메일 사용자의 계정에 .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

질문 2: 이제 폴더가 비어 있어도 이동 명령이 제대로 작동합니까?

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중간 폴더가 존재하지 않는 경우 모든 중간 폴더를 생성하도록 지시하며, 기존 폴더를 생성하려고 하면 오류가 발생하지 않습니다.

이는 쉘이 확장을 위해 보강될 수 있다고 가정합니다. 그렇지 않은 경우 세 번의 별도 호출로 나눕니다 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"스크립트에서 대신 사용하는 ~이유는 더 보기 좋고 자체 문서화되며 다른 변수처럼 동작하기 때문입니다( ~아무 것도 없음).

관련 정보