내 이전 질문,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"
스크립트에서 대신 사용하는 ~
이유는 더 보기 좋고 자체 문서화되며 다른 변수처럼 동작하기 때문입니다( ~
아무 것도 없음).