Chinaunix首页 | 论坛 | 博客
  • 博客访问: 263635
  • 博文数量: 52
  • 博客积分: 1379
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:34
文章分类

全部博文(52)

文章存档

2011年(48)

2010年(4)

分类: LINUX

2011-02-21 10:43:27

linux kernel代码很多, 有时候想看代码用 cscope会看到很多不想看到的代码
清理之后代码就少多了
也适用别的地方



原理:
编译内核之后如果某个文件没有被使用,那么就可以删除,这可以用脚本遍历一下
但是对我来说写几行C代码更简单
  1. #include <ftw.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <libgen.h>
  7. #include <sys/time.h>

  8. char *prog;
  9. int do_delete;

  10. int suffix_is_source(const char *fpath)
  11. {
  12.     char *s = "cChSs";
  13.     char *dot = strrchr(fpath, '.');
  14.     if (!dot)
  15.         return 0;
  16.     dot++;
  17.     if (*dot == 0)
  18.         return 0;
  19.     if (dot[1] != 0)
  20.         return !strcmp(dot, "ko");
  21.     return !!strchr(s, *dot);
  22. }

  23. int touch_fn(const char *fpath, const struct stat *sb, int typeflag)
  24. {
  25.     const char *bname = strrchr(fpath, '/');
  26.     if (bname)
  27.         bname++;
  28.     else
  29.         bname = fpath;
  30.     if (*bname != '.' &&
  31.             typeflag == FTW_F &&
  32.              suffix_is_source(bname)) {
  33.         if (do_delete == 0) {
  34.             /* 201001010000 */
  35.             struct timeval am[2] = {{1262275200, 0},{1262275200, 0}};
  36.             if (utimes(fpath, am) < 0) {
  37.                 perror(fpath);
  38.                 exit(1);
  39.             }
  40.         } else {
  41.             if (sb->st_atime == 1262275200) {
  42.                 if (unlink(fpath) < 0) {
  43.                     perror(fpath);
  44.                     exit(1);
  45.                 }
  46.                 //printf("no access: %s\n", fpath);
  47.             } else {
  48.                 //printf("accessed: %s\n", fpath);
  49.             }
  50.         }
  51.     }

  52.     return 0;
  53. }

  54. void usage()
  55. {
  56.     fprintf(stderr, "usage:\n");
  57.     fprintf(stderr, "%s option dir\n\t", prog);
  58.     fprintf(stderr, "option: -t(touch)\n\t");
  59.     fprintf(stderr, "option: -d(delete)\n");
  60.     exit(1);
  61. }
  62. int main(int argc, char **argv)
  63. {
  64.     prog = argv[0];
  65.     if (argc != 3)
  66.         usage();

  67.     if (strcmp(argv[1], "-t") == 0)
  68.         do_delete = 0;
  69.     else if (strcmp(argv[1], "-d") == 0)
  70.         do_delete = 1;
  71.     else
  72.         usage();

  73.     return ftw(argv[2], touch_fn, 0);
  74. }

我曾经用一个类似的方法为一个嵌入式系统清理了文件系统
一个文件系统上有很多文件,由于容量有限,不能装下所有的文件
但是一个一个查找哪个文件需要哪个不需要不太容易, 由于我们的系统功能就那么几个,方法如下:

用NFS挂载该文件系统,事先touch_all
挂载之后把所有的功能都使用一遍,这样HOST 上的/NFSROOT里面的某些文件就会被读取,通过stat信息是
能得到什么文件需要的,再把不需要的删除,剩下的就可以放到flash上了


阅读(1532) | 评论(0) | 转发(0) |
0

上一篇:cc-option

下一篇:switch_to 宏

给主人留下些什么吧!~~