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