結果を確認してメールで送信

結果を確認してメールで送信

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)またはスクリプトから連想配列を入力します。

おすすめ記事