我正在尝试编写一个脚本,当目录超过一定限制时,该脚本可以从目录中删除旧文件。 这是我的脚本
#!/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
但它不起作用,它创建备份但在目录超出限制后不删除旧文件
最佳答案
你的问题不清楚(我们只能猜测“限制”是什么意思,但我们不明白它是什么),并且缺乏动力。
在 system call 级别(请参阅 syscalls(2) ),相关系统调用是带有 RLIMIT_FSIZE
的 setrlimit(2) ,然后是带有 SIGXFSZ
的 signal(7) 相关系统调用(例如 sigaction(2) )。
因此,您可以使用 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) 以外的其他实用程序来实现此目的(例如 dar 、 afio 等)。请注意,mv(1) & cp(1) & tar 有一些 --backup
选项。也许您可能会考虑 logrotate(8) 来处理不断增长的日志文件。
关于linux - 是否可以对文件夹应用计数功能,然后在文件夹超出限制时删除文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50267248/