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
ループで1行ずつ読み取られ、名前付き連想配列に各ユーザーのファイルリストを作成しますfiles
。次のfor
ループでは、1つ以上の古いファイルを持つ識別された各ユーザーに対して、そのsm
ファイル所有者に古いファイルの電子メールを送信するために関数(sendmail)が呼び出されます。
デフォルトPostfix
では、インストールはローカル配信エージェントを使用して、デフォルトのユーザー名に向けられたメールを(ローカル)システムのレガシーUNIXシステムアカウントに配信しようとします。外部でホストされているメールアカウントに転送するには、ユーザー名を外部のメールアドレスに変換する「エイリアスマッピング」を提供する必要があります(例:[Eメール保護]email_addr
)またはスクリプトから連想配列を入力します。
答え2
find *path* -mtime +180 -ls | mailx -s "old files" [email protected]