自己动手写shell命令之du

du命令可以查看指定文件夹占用的磁块数,以下为linux下c语言实现shell du指令的代码(支持-k选项):

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>

int disk_usage(char *);

int k = 0;

int main(int argc,char * argv[])
{
	int i;
	for(i = 1;i < argc;i++)
	{
	    if(strcmp(argv[i],"-k") == 0)
	    {
	         k = 1;
	         break;
	    }
	}
	if(argc == 1 && k == 0)
		disk_usage(".");
	else if(argc == 2 && k == 1)
		disk_usage(".");
	else
	{
	    int index = 1;
	    while(argc > 1)
	    {
	        if(strcmp(argv[index],"-k") != 0)
	        	disk_usage(argv[index]);
	        index++;
	        argc--;
	    }
	}
	return 0;
}

int disk_usage(char * pathname)
{
	DIR * dir;
	int sum = 0;
	struct dirent * direntp;
	struct stat stat_buffer;
	if((dir = opendir(pathname)) == NULL)
	{
		perror("error");
		exit(1);
	}
	while((direntp = readdir(dir)) != NULL)
	{
		char absolute_pathname[255];
		strcpy(absolute_pathname,pathname);
		strcat(absolute_pathname,"/");
		strcat(absolute_pathname,direntp->d_name);
		if(strcmp(direntp->d_name,".") == 0 || strcmp(direntp->d_name,"..") == 0)
		{
			if(strcmp(direntp->d_name,".") == 0)
			{
				lstat(absolute_pathname,&stat_buffer);
				sum = sum + stat_buffer.st_blocks;
			}
			continue;
		}
		lstat(absolute_pathname,&stat_buffer);
		if(S_ISDIR(stat_buffer.st_mode))
		{
			//sum = sum + stat_buffer.st_blocks;
			sum = sum + disk_usage(absolute_pathname);
		}
		else
		{
			sum = sum + stat_buffer.st_blocks;
		}
	}
//	lstat(pathname,&stat_buffer);
//	sum = sum + stat_buffer.st_blocks;
	if(k == 0)
		printf("%-5.5d %s\n",sum,pathname);
	else
		printf("%-5.5d %s\n",sum/2,pathname);
	return sum;
}
时间: 2024-10-14 08:09:06

自己动手写shell命令之du的相关文章

自己动手写shell命令之write

Linux下write命令允许用户跟其他终端上的用户对话.用c语言实现shell命令write,代码如下: #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <utmp.h> #include <pwd.h> #include <sys/types.h> #include <stdlib.h> #include <sys/stat.h

自己动手写shell命令之ls -R1fF

ls命令的R参数代表递归的列出所有子文件夹中的所有文件,1表示每一行只显示一个文件或文件夹,f表示不排序即输出,F表示在每项的输出的最后根据其文件类型相应的加上*/=>@|字符.通过c语言实现ls -R1fF命令的效果,其源代码如下: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <pwd.h> #in

自己动手写shell命令之who

思路:在unix系统中有一个名为utmp的文件,里面存着当前登录到系统中用户的信息.utmp这个文件里面保存的是结构数组,数组元素是utmp类型的结构.实现who命令,只要依次从utmp文件中读出utmp类型的结构体,然后通过合适的方式将它显示出来即可.如果每一次只从文件里面读一个结构体数据,那么每一个结构体都要进行依次系统调用.而又因为系统调用比较耗时(涉及到用户态到核心态的切换),所以这样会造成程序低效.我们使用缓冲技术,每次从文件中读若干结构体数据到内存中,当这些数据都已经显示在终端后,我

自己动手写shell命令之ls

linux下ls命令(支持-R參数)的c语言实现: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <pwd.h> #include <grp.h> #include <string.h> void do_ls(char *); void do_stat(char *,char *);

自己动手写shell命令之more

unix下more命令的简单实现: #include <stdio.h> #define PAGELEN 24 #define LINELEN 512 int do_more(FILE * file); int see_more(FILE * file); int main(int argc,char * argv[]) { FILE * fp; if(argc == 1) do_more(stdin); else { int argv_index = 1; while(argc > 1

自己动手写shell命令之pwd

思路:(1)得到"."的i节点号,称其为n(使用stat) (2)chdir ..(使用chdir) (3)找到inode号为n的节点,得到其文件名. 重复上述操作直到当前目录"."的inode值等于".."的inode值 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> ino_t

自己动手写shell之chgrp,chown,chmod

1.chgrp实现 #include <grp.h> #include <unistd.h> void chgrp(char * groupname,char * filename) { struct group * groupinfo = NULL; if((groupinfo = getgrnam(groupname)) == NULL) { printf("groupname does not exist\n"); return; } if(access(

自己写shell命令pwd

思维:(1)得到"."的i节点号,叫n(使用stat) (2)chdir ..(使用chdir) (3)找到inode号为n的节点,得到其文件名称. 反复上述操作直到当前文件夹"."的inode值等于".."的inode值 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> ino_t

写了一个Mac快速设置、打开和关闭Web代理的Shell命令

缘由(痛点) 每次在Mac上设置Web代理,都需要点开"系统偏好设置 -- 网络 -- 高级 -- 代理",然后分别设置Web代理(HTTP)和安全Web代理(HTTPS),设置完后,还要点"好 -- 应用".如果要关闭Web代理也是如此,只是点到代理设置面板后,只需要取消勾选Web代理和安全Web代理. 个人觉得这种操作很繁琐,对于一个经常需要改Web代理的人来说,这简直是灾难性的重复操作.所以这段时间学了些Linux Shell脚本编程的知识,写了两个Shell