我是Unix脚本的新手,我试图创建Unix脚本一周,但我不能。请帮助我。
我有多个不同的文件超过100个(所有文件名都不同),文件名包含目录中的日期字符串(例如:20171101)。我想比较这些文件名日期和我的输入日期(今天 - 10days = 20171114),目录中的文件只使用文件名字符串日期,如果它小于我的输入日期,那么我必须删除该文件。有谁可以请你帮忙。感谢
我的剧本:
ten_days_ago=$(date -d "10 days ago" +%Y%m%d)
cd "$destination_dir" ;
ls *.* | awk -F '-' '{print $2}'
ls *.* | awk -F '-' '{print $2}' > removal.txt
while read filedate
do
if [ "$filedate" -lt "$ten_days_ago" ] ; then
cd "$destination_dir" ;
rm *-"$filedate"*
echo "deletion done"
fi
done <removal.txt
这个脚本运行正常。但是我也需要发送一封电子邮件 - 如果删除已经完成,那么 - 通过电子邮件,否则将失败电子邮件 但是如果我正在编写电子邮件,那么在while循环中将会迭代
答案 0 :(得分:0)
您可能正在尝试从循环中间切换到mail
。 (您的问题应该真正显示此代码,否则我们无法说出错误。)一种常见的技术是将循环的输出重定向到文件,然后发送。 (使用临时文件有点难看,但是当循环没有输出时,避免发送空消息。)
只需循环遍历文件并决定删除哪些文件。
#!/bin/bash
t=$(mktemp -t tendays.XXXXXXXX) || exit
# Remove temp file if interrupted, or when done
trap 'rm -f "$t"' EXIT HUP INT TERM
ten_days_ago=$(date -d "10 days ago" +%Y%m%d)
for file in *-[1-9]*[1-9]-*; do
date=${file#*-} # strip prefix up through first dash
date=${date%-*} # strip from last dash from the previous result
if [ "$date" -lt "$ten_days_ago" ]; then
rm -v "$file"
fi
done >"$t" 2>&1
test -s "$t" || exit # Quit if empty
mail -s "Removed files" recipient@example.net <"$t"
我删除了(重复!)cd
,因此可以在任何目录中运行 - 只需在运行脚本之前切换到所需的目录。这也使得在具有一组临时文件的目录中进行测试变得更容易。
收集脚本的标准错误也意味着如果rm
由于某种原因失败或者您有其他例外情况,邮件将包含任何错误消息。