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

时间:2020-12-27 22:27:21

    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>
#include <grp.h>
#include <string.h>

void listdir(char *);
char get_type(struct stat *);

int main(int argc,char * argv[])
{
	if(argc == 1)
		listdir(".");
	else
	{
		int index = 1;
		while(argc > 1)
		{
			listdir(argv[index]);
			index++;
			argc--;
		}
	}
	return 0;
}

void listdir(char * dirname)
{
	DIR * dir;
	struct stat info;
	//char pointer[];
	struct dirent * direntp;
	if((dir = opendir(dirname)) != NULL)
	{
		printf("%s:\n",dirname);
		while((direntp = readdir(dir)) != NULL)
		{
			char absolute_pathname[255];
			strcpy(absolute_pathname,dirname);
			strcat(absolute_pathname,"/");
			strcat(absolute_pathname,direntp->d_name);
			lstat(absolute_pathname,&info);
			printf("%s",direntp->d_name);
			printf("%c\n",get_type(&info));
		}
		printf("\n");
		rewinddir(dir);
		while((direntp = readdir(dir)) != NULL)
		{
			if(strcmp(direntp->d_name,".") == 0 || strcmp(direntp->d_name,"..") == 0)
				continue;
			char absolute_pathname[255];
			strcpy(absolute_pathname,dirname);
			strcat(absolute_pathname,"/");
			strcat(absolute_pathname,direntp->d_name);
			lstat(absolute_pathname,&info);
			if(S_ISDIR((&info)->st_mode))
				listdir(absolute_pathname);
		}
	}
}

char get_type(struct stat * info)
{
	if(S_ISCHR(info->st_mode))
		return '*';
	if(S_ISDIR(info->st_mode))
		return '/';
	if(S_ISSOCK(info->st_mode))
		return '=';
	if(S_ISBLK(info->st_mode))
		return '>';
	if(S_ISLNK(info->st_mode))
		return '@';
	if(S_ISFIFO(info->st_mode))
		return '|';
	return ' ';
}