linux kernel代码很多, 有时候想看代码用 cscope会看到很多不想看到的代码
清理之后代码就少多了
也适用别的地方
原理:
编译内核之后如果某个文件没有被使用,那么就可以删除,这可以用脚本遍历一下
但是对我来说写几行C代码更简单
- #include <ftw.h>
-
#include <stdio.h>
-
#include <unistd.h>
-
#include <string.h>
-
#include <stdlib.h>
-
#include <libgen.h>
-
#include <sys/time.h>
-
-
char *prog;
-
int do_delete;
-
-
int suffix_is_source(const char *fpath)
-
{
-
char *s = "cChSs";
-
char *dot = strrchr(fpath, '.');
-
if (!dot)
-
return 0;
-
dot++;
-
if (*dot == 0)
-
return 0;
-
if (dot[1] != 0)
-
return !strcmp(dot, "ko");
-
return !!strchr(s, *dot);
-
}
-
-
int touch_fn(const char *fpath, const struct stat *sb, int typeflag)
-
{
-
const char *bname = strrchr(fpath, '/');
-
if (bname)
-
bname++;
-
else
-
bname = fpath;
-
if (*bname != '.' &&
-
typeflag == FTW_F &&
-
suffix_is_source(bname)) {
-
if (do_delete == 0) {
-
/* 201001010000 */
-
struct timeval am[2] = {{1262275200, 0},{1262275200, 0}};
-
if (utimes(fpath, am) < 0) {
-
perror(fpath);
-
exit(1);
-
}
-
} else {
-
if (sb->st_atime == 1262275200) {
-
if (unlink(fpath) < 0) {
-
perror(fpath);
-
exit(1);
-
}
-
//printf("no access: %s\n", fpath);
-
} else {
-
//printf("accessed: %s\n", fpath);
- }
-
}
-
}
-
-
return 0;
-
}
-
-
void usage()
-
{
-
fprintf(stderr, "usage:\n");
-
fprintf(stderr, "%s option dir\n\t", prog);
-
fprintf(stderr, "option: -t(touch)\n\t");
-
fprintf(stderr, "option: -d(delete)\n");
-
exit(1);
-
}
-
int main(int argc, char **argv)
-
{
-
prog = argv[0];
-
if (argc != 3)
-
usage();
-
-
if (strcmp(argv[1], "-t") == 0)
-
do_delete = 0;
-
else if (strcmp(argv[1], "-d") == 0)
-
do_delete = 1;
-
else
-
usage();
-
-
return ftw(argv[2], touch_fn, 0);
-
}
我曾经用一个类似的方法为一个嵌入式系统清理了文件系统
一个文件系统上有很多文件,由于容量有限,不能装下所有的文件
但是一个一个查找哪个文件需要哪个不需要不太容易, 由于我们的系统功能就那么几个,方法如下:
用NFS挂载该文件系统,事先touch_all
挂载之后把所有的功能都使用一遍,这样HOST 上的/NFSROOT里面的某些文件就会被读取,通过stat信息是
能得到什么文件需要的,再把不需要的删除,剩下的就可以放到flash上了
阅读(1532) | 评论(0) | 转发(0) |