huayuett 2021-05-07 16:24 采纳率: 100%
浏览 25
已结题

在Linux c的环境下,如何输出指定路径下所有size大于等于1mb的文件的名字?

#include "apue.h"
#include
#include

typedef   int   Myfunc(const char *, const struct stat *, int);

static Myfunc   myfunc;
static int       myftw(char *, Myfunc *);
static int       dopath(Myfunc *);

static long   nreg, ndir, nblk, nchr, nfifo, nslink, nsock, ndnr, ntot;

int
main(int argc, char *argv[])
{
   int       ret;

   if (argc != 2)
       err_quit("usage: ftw ");

   ret = myftw(argv[1], myfunc);       /* does it all */

   ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock + ndnr;
   if (ntot == 0)
       ntot = 1;       /* avoid divide by 0; print 0 for all counts */
   printf("regular files = %7ld, %5.2f %%\n", nreg,
   nreg*100.0/ntot);
   printf("directories = %7ld, %5.2f %%\n", ndir,
   ndir*100.0/ntot);
   printf("block special = %7ld, %5.2f %%\n", nblk,
   nblk*100.0/ntot);
   printf("char special = %7ld, %5.2f %%\n", nchr,
   nchr*100.0/ntot);
   printf("FIFOs = %7ld, %5.2f %%\n", nfifo,
   nfifo*100.0/ntot);
   printf("symbolic links = %7ld, %5.2f %%\n", nslink,
   nslink*100.0/ntot);
   printf("sockets = %7ld, %5.2f %%\n", nsock,
   nsock*100.0/ntot);
printf("permission denied = %7ld, %5.2f %%\n", ndnr,
   ndnr*100.0/ntot);
   exit(ret);
}

#define   FTW_F   1       /* file other than directory */
#define   FTW_D   2       /* directory */
#define   FTW_DNR   3   /* directory that can't be read */
#define   FTW_NS   4   /* file that we can't stat */

static char *fullpath;   /* contains full pathname for every file */
static size_t pathlen;

static int           /* we return whatever func() returns */
myftw(char *pathname, Myfunc *func)
{
   // fullpath = path_alloc(&pathlen);   /* malloc PATH_MAX+1 bytes */

fullpath = (char *)malloc((size_t) pathlen);
                           /* ({Prog pathalloc}) */
   if (pathlen <= strlen(pathname)) {
       pathlen = strlen(pathname) * 2;
       if ((fullpath = realloc(fullpath, pathlen)) == NULL)
           err_sys("realloc failed");
   }
   strcpy(fullpath, pathname);
   return(dopath(func));
}


static int dopath(Myfunc* func)
{
   struct stat       statbuf;
   struct dirent   *dirp;
   DIR               *dp;
   int               ret, n;

   if (lstat(fullpath, &statbuf) < 0)   /* stat error */
       return(func(fullpath, &statbuf, FTW_NS));
   if (S_ISDIR(statbuf.st_mode) == 0)   /* not a directory */
       return(func(fullpath, &statbuf, FTW_F));

   /*
   * It's a directory. First call func() for the directory,
   * then process each filename in the directory.
   */
   if ((ret = func(fullpath, &statbuf, FTW_D)) != 0)
       return(ret);

   n = strlen(fullpath);
   if (n + NAME_MAX + 2 > pathlen) {   /* expand path buffer */
       pathlen *= 2;
       if ((fullpath = realloc(fullpath, pathlen)) == NULL)
           err_sys("realloc failed");
   }
   fullpath[n++] = '/';
   fullpath[n] = 0;

   if ((dp = opendir(fullpath)) == NULL)   /* can't read directory */
       return(func(fullpath, &statbuf, FTW_DNR));

   while ((dirp = readdir(dp)) != NULL) {
       if (strcmp(dirp->d_name, ".") == 0 ||
       strcmp(dirp->d_name, "..") == 0)
               continue;       /* ignore dot and dot-dot */
       strcpy(&fullpath[n], dirp->d_name);   /* append name after "/" */
       if ((ret = dopath(func)) != 0)       /* recursive */
           break;   /* time to leave */
   }
   fullpath[n-1] = 0;   /* erase everything from slash onward */

   if (closedir(dp) < 0)
       err_ret("can't close directory %s", fullpath);
   return(ret);
}

static int
myfunc(const char *pathname, const struct stat *statptr, int type)
{
   switch (type) {
   case FTW_F:
       switch (statptr->st_mode & S_IFMT) {
       case S_IFREG:   nreg++;       break;
       case S_IFBLK:   nblk++;       break;
       case S_IFCHR:   nchr++;       break;
       case S_IFIFO:   nfifo++;   break;
       case S_IFLNK:   nslink++;   break;
       case S_IFSOCK:   nsock++;   break;
       case S_IFDIR:   /* directories should have type = FTW_D */
           err_dump("for S_IFDIR for %s", pathname);
       }
       break;
   case FTW_D:
       ndir++;
       break;
   case FTW_DNR:
ndnr++;
       err_ret("can't read directory %s", pathname);
       break;
   case FTW_NS:
       err_ret("stat error for %s", pathname);
       break;
   default:
       err_dump("unknown type %d for pathname %s", type, pathname);
   }
   return(0);
}

在Linux c的环境下,如何输出指定路径下所有size大于等于1mb的文件的名字,并在最后计算这些文件的数量和总大小?

基础代码是输出指定路径下文件type的比例,文体要求是在这个代码中进行更改。谢谢

  • 写回答

1条回答 默认 最新

  • stone-石头 2021-05-07 16:33
    关注

    可以用du -sh来实现

    评论

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办