Unix脚本 - 将文件名日期的数量与单个输入日期进行比较

时间:2017-11-24 11:26:58

标签: bash

我是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循环中将会迭代

1 个答案:

答案 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由于某种原因失败或者您有其他例外情况,邮件将包含任何错误消息。

you should basically never use ls in scripts.