一. 问题描述 linux的一个目录下存放着日志文件,每个日志文件都是打包压缩好的。每次生成新的日志文件后,都要检查一下是否超过10个,如果超过10个则删掉最旧的日志文件。依此滚动循环。
二. 代码实现
- 假设存放日志的目录是:/home/log,且该目录下只存放日志文件,无其他文件
- 假设日志文件名格式为log_xxx_xxx.zip
- bash版
num=`ls /home/log -l |grep "^-"|wc -l`;
retaincount = 10;
cd /home/log
if [ $num -gt $retaincount ];
then
num=`expr $num - $retaincount`
ls -tr *log_*|head -$num|xargs rm -rf {}
fi
- C++版
int purgeOldFiles(const string &dir_path, const string &retrieve_str, const uint retain_count)
{
typedef struct{
string filename;
time_t filemtime;
} File_STU;
struct cmp{
bool operator()(const File_STU &fileA, const File_STU &fileB){
return fileA.filemtime < fileB.filemtime;
}
};
DIR *dir = opendir(dir_path.c_str());
if(NULL == dir)
{
printf("opendir error: %s \n", strerror(errno));
return -1;
}
struct dirent *dirp = NULL;
struct stat fileStat;
vector<File_STU> fileVec;
while((dirp = readdir(dir)) != NULL)
{
if(!string(dirp->d_name).compare(".") || !string(dirp->d_name).compare("..")){
continue;
}
if(dirp->d_type == DT_REG &&
(string(dirp->d_name).find(retrieve_str) != string::npos)){
string fullpath = dir_path + dirp->d_name;
if(0 != stat(fullpath.c_str(), &fileStat)){
printf("read file stat error: %s \n", strerror(errno));
continue;
}
File_STU tmpfile = {fullpath, fileStat.st_ctime};
fileVec.emplace_back(tmpfile);
}
}
closedir(dir);
if(fileVec.size() <= retain_count){
return 0;
}
else{
sort(fileVec.begin(), fileVec.end(), cmp{});
for(uint i = 0; i < fileVec.size() - retain_count; ++i){
std::remove(fileVec[i].filename.c_str());
}
}
return 0;
}
|