180일이 지난 파일을 식별하고 싶습니다. 다음 명령을 사용하여 이 작업을 수행합니다.
find *path* -mtime +180 -exec ls -la \; > file.txt
문제는 이 결과 세트에서 개별 파일 소유자에게 오래된 파일이 있음을 알리는 이메일을 보내고 싶다는 것입니다.
어떻게 해야 하나요?
답변1
예를 들어 메일 서버/MTA를 실행 중인 경우 Postfix
기본 스크립트는 다음과 같습니다.
#!/bin/bash
declare -A files email_addr
# Compose array of external e-mail addresses:
# (add a line for each user with an external address)
email_addr[username1]="[email protected]"
# Define a send mail function (relies on local MTA)
function sm()
{
sendmail -t << EOF
From: System Administration <[email protected]>
To: $1
Subject: Old file(s)
Content-Type: text/plain; charset="UTF-8"
Hello $2, you have one or more old files:
$3
EOF
}
# Make list of owners and their old files
while read -r username filename; do
files[$username]=${files[$username]}${filename}$'\n'
done < <(find /home/ -mtime +180 -type f -printf "%u %p\n" 2>/dev/null)
# Send e-mails, one to each username
for username in "${!files[@]}"; do
sm "${email_addr[$username]:-$username}" "$username" "${files[$username]}"
done
이 find
명령은 이전 파일("이전 파일"은 최소 180일 동안 수정되지 않은 파일로 정의됨)의 사용자 이름 및 파일 이름 목록을 생성합니다. 목록은 while
루프로 한 줄씩 읽어서 이름이 지정된 연관 배열에 각 사용자의 파일 목록을 작성합니다 files
. 다음 for
루프에서는 하나 이상의 이전 파일이 있는 식별된 각 사용자에 sm
대해 해당 파일 소유자에게 이전 파일에 대한 이메일을 보내기 위해 함수(sendmail)가 호출됩니다.
기본적으로 Postfix
설치에서는 로컬 배달 에이전트를 사용하여 기본 사용자 이름으로 향하는 메일을 (로컬) 시스템의 레거시 UNIX 시스템 계정으로 배달하려고 시도합니다. 외부에서 호스팅되는 메일 계정으로 전달하려면 사용자 이름을 외부 이메일 주소로 변환하는 "별칭 매핑"을 제공해야 합니다(예:[이메일 보호됨]email_addr
) 또는 스크립트에서 연관 배열을 채웁니다.
답변2
find *path* -mtime +180 -ls | mailx -s "old files" [email protected]