我有很多文件和文件夹。它们的语法类似于此路径
的/ opt /日志/ QNAP / [玉簪,hostB上] / 2012/3月12日
SixMonthAgo=$(date --date='190 day ago' "+%Y/%m/%d/%H") = 2011/06/12/12
Hosts="hosta hostb"
maxDay=181
qnapFolder="/opt/logs/qnap"
for host in $(echo "${Hosts}"); do
maxDayAgo=$(date --date="${maxDay} day ago" "+%Y/%m/%d")
countCharacters=$(echo ${maxDayAgo} | wc -c)
if [ ${countCharacters} -ge 10 ]; then
rm -rf ${qnapFolder}/${host}/${maxDayAgo} #output of this just like 2012/03/12
fi
done
但有时我得到一个错误。这个解决方案无法正常工作。我想在180天之前删除所有文件和文件夹。我怎样才能做到这一点 ?例如,必须在2012/03/23之前的所有文件和目录之前删除。
提前致谢
答案 0 :(得分:3)
find命令很慢?你确定吗?唯一的缺点是它无法删除目录结构。
find /opt/logs/qnap -type f -mtime +180 -delete
如果确实同时创建了目录,那么删除-type f
可能对您有用。
find /opt/logs/qnap -mtime +180 -delete
发现你很快......但如果你真的想用shell脚本来做...
CUTOFF=$(date --date='190 day ago' "+%s)
HOSTS="hosta hostb"
DIRECTORY="/opt/logs/qnap"
for HOST in $(ls -1 $DIRECTORY); do
if [ -d $DIRECTORY$HOST ]; then
for DATE in $(ls -1 $DIRECTORY$HOST); do
if [ -d $DIRECTORY$HOST$DATE ]; then
if [ "$CUTOFF" < "$(stat --format="%Y" $DIRECTORY$HOST$DATE)" ]; then
echo "Deleting $DIRECTORY$HOST$DATE"
rm -rf $DIRECTORY$HOST$DATE;
fi
fi
done
fi
答案 1 :(得分:0)
我已经找到了解决方案,如下所示。例如,假设180天前的那一天是2012/04/17。这只删除了从2012/04/17开始到2012/04/01的所有目录。其次,它在2012/04之前每月删除。删除的是2012 / 03,02012 / 02和2012/01。
# SixMonthAgo=$(date --date='190 day ago' "+%Y/%m/%d/%H") = 2011/06/12/12
maxDay=104
qnapFolder="/opt/logs/qnap"
for host in $(echo "${Hosts}"); do
maxDayAgo=$(date --date="${maxDay} day ago" "+%Y/%m/%d")
countCharacters=$(echo ${maxDayAgo} | wc -c)
if [ ${countCharacters} -ge 10 ]; then
year=$(echo ${maxDayAgo} |cut -d '/' -f 1)
month=$(echo ${maxDayAgo} |cut -d '/' -f 2) #2012/06
day=$(echo ${maxDayAgo} |cut -d '/' -f 3) #2012/06/04
minday=00
minmonth=00
until [ $month -le $minmonth ]
do
until [ $day -le $minday ]
do
rm -rf ${qnapFolder}/${host}/2012/$month/$day
day=$(printf "%02d" $(expr $day - 01))
done
month=$(printf "%02d" $(expr $month - 01))
rm -rf ${qnapFolder}/${host}/2012/$month
done
fi
done
谢谢