是否可以对文件夹应用计数功能,然后在文件夹超出限制时删除文件?

时间:2018-05-10 06:55:45

标签: linux bash

我正在尝试编写一个脚本,当目录超过某个限制时,该脚本可以从目录中删除旧文件。 这是我的剧本

#!/bin/bash
#incremental backup of upload folder only
LIMIT=2
TIME=`date +%b-%d-%y%s`
FILENAME=backup-$TIME.tgz
SRCDIR=/home/Man/blabla
DESDIR=/home/Man/newdir
EXCFILE=/home/Man/blabla/up
if [ $LIMIT -gt 2 ]; then 
cd $DESDIR
ls -lt | grep .tgz | tail -n 1 | xargs -r rm
tar -cvzf $DESDIR/$FILENAME $SRCDIR --exclude=$EXCFILE 
else
tar -cvzf $DESDIR/$FILENAME $SRCDIR --exclude=$EXCFILE 
fi

但它无法正常工作,它会创建备份但不会在dir超出限制后删除旧文件

2 个答案:

答案 0 :(得分:0)

你的问题不清楚(我们可以猜出“限制”意味着什么,但我们不明白它是什么),缺乏动力。

system call级别(请参阅syscalls(2)),相关的系统调用为setrlimit(2),其中RLIMIT_FSIZEsignal(7)相关(例如sigaction(2) } SIGXFSZ

因此,您可以使用ulimit内置和trap。但是,shell脚本执行的程序可能会更改文件大小限制,并且可能会捕获SIGXFSZ信号。

请注意,目录的大小(由stat(2)给出,因此stat(1)& ls(1)其文件的累计大小(因为某些文件在几个目录中可能是hard-linked;文件是inodes - 请参阅inode(7))。它只是目录条目的大小。

或者,您可以计算文件的累计大小(使用du(1)find(1)gawk(1))并根据它执行某些操作,可能会删除一些大文件(但请考虑 - 也许决定忽略它们 - 其他进程在执行脚本期间编写文件或目录。)

也许您可能会对disk quotas感兴趣(请参阅quotactl(2)quota(1)quotacheck(8)

你可以做incremental backups。您可以为此目的使用除tar(1)之外的其他工具(例如darafio,...)。请注意mv(1)& cp(1)& tar有一些--backup选项。也许您可以考虑logrotate(8)来处理日益增长的日志文件。

答案 1 :(得分:0)

为什么我没有使用logrotate,因为这不是必需的。无论如何,我自己解决了这个问题。我添加了一个count计算函数来计算目录中的.tgz文件,每当$ count超过$ limit时,旧文件就会被删除。

LIMIT=3 
COUNT=$(ls $DESDIR | grep '\.tgz$' | wc -l )
if [ "$COUNT" -gt "$LIMIT" ]; then
cd $DESDIR
ls -t | grep .tgz | tail -n "+$(($LIMIT + 1))" | xargs -r rm && tar -cvzf $DESDIR/$FILENAME $SRCDIR --exclude=$EXCFILE --exclude=$EXCSNRFILE
else 
echo "script is not working"