识别结果并通过电子邮件发送

识别结果并通过电子邮件发送

我想识别超过 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]

相关内容