linux下ls-l命令

#include<stdio.h> 
#include <sys/ioctl.h>
#include<sys/types.h>
#include<dirent.h>
#include<unistd.h>
#include <string.h>
#define N 256
#include<stdlib.h>
char arry[N][N];
void do_ls(char []);
int get_clo();
main(int ac,char *av[])
{
	if(ac==1)
	do_ls(".");
	else
		while(--ac){
			printf("%s:\n",*++av);
			do_ls(*av);
		}
}
int get_clo() //获取此时屏幕的宽度  
{
	struct winsize size; 
	if (isatty(STDOUT_FILENO) == 0)
		return 0;
	if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &size)<0)
	{ 
		perror("ioctl TIOCGWINSZ error");  
		return 0;
	} 
	return size.ws_col;
}
void do_ls(char dirname[])
{
    DIR *dir_ptr;
	char *x;
    struct dirent *direntp;
	int i = 0;int count=0;int j=0;int b=0;
	int length=0,num=0;
	int screen_clo;
	screen_clo=get_clo(); 
	x=(char *)malloc(30*sizeof(char));
    if((dir_ptr=opendir(dirname))==NULL)
        fprintf(stderr,"ls1:cannot open %s\n",dirname);
    else
	{
		while((direntp=readdir(dir_ptr))!=NULL) {	
	    strcpy(arry[i],direntp->d_name);
		i++;
		count++;
		}
		for(i=0;i<count;i++)//冒泡排序,把文件名长的排在后面  
			for(j=0;j<count-i-1;j++)
			{
				if (strlen(arry[j])>strlen(arry[j+1]))
				{
					strcpy(x,arry[j]);
					strcpy(arry[j],arry[j+1]);
					strcpy(arry[j+1],x);
				}
				
			}
		for(i=0;i<count;i++)//求出所有文件中文件名最长的文件长度
		{
			while(length<strlen(arry[i]))
			{
				length=strlen(arry[i]);
			}
		}
		num=screen_clo/(length+3);
		printf("%d\n%d\n",count,num); //文件数和列数
		for(i=0;i<count;i++)
		{
			printf("%s",arry[i]);
			for(b=0;b<((length+3)-strlen(arry[i]));b++)//文件和最长文件比较,少的长度用空格添加
				printf(" ");
			if(i!=0)
			{
				if((i+1)%num==0)
				{
					printf("\n");
				}
			}
		}		
		printf("\n");
		closedir(dir_ptr);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ls -l 命令Linux 下用于显示文件和目录详细信息的命令。使用方法如下: ``` ls -l [文件或目录名] ``` 该命令会显示出文件或目录的权限、所有者、文件大小、修改时间等信息。如果不指定文件或目录名,则会显示当前目录下的所有文件和目录的详细信息。 ### 回答2: ls -l命令是在Linux、Unix系统中用来列出目录及文件的详细信息的命令。在执行该命令时,系统会显示当前目录下的所有文件和子目录的名称、权限、所有者、所属组、大小和创建时间等详细信息。如果想要仿写这个命令,我们需要了解一些Linux系统的基础知识。 首先,要了解Linux系统中文件和目录的权限,包括读、写、执行等。 其次,需要了解文件和目录的所有权,包括所有者和所属组。 最后,需要知道如何获取文件和目录的详细信息,包括文件类型、大小、创建时间等。 仿写ls -l命令,可以使用Python等编程语言实现。具体步骤如下: 1. 定义一个函数,将要列举的目录作为参数传入。 2. 使用os模块中的listdir()函数获取目录下所有文件和子目录的名称。 3. 遍历目录下的所有文件和子目录,获取文件和目录的详细信息。可以使用os模块中的stat()函数获取文件的详细信息,使用time模块中的gmtime()将时间戳转换为可读日期格式。 4. 根据文件类型(文件或目录)设置相应的权限字符串(如-rw-r--r--表示文件的读写权限为所有者可读写、所有组用户可读、其他用户可读),将文件和目录的权限、所有权、大小和创建时间等信息作为字符串输出。 5. 输出结果。 例如,假设要列举目录“/home/user/”中的所有文件和子目录的详细信息,可以仿写以下代码: import os import stat import sys import time def ls_l(directory): for file in os.listdir(directory): path = os.path.join(directory, file) mode = stat.S_IMODE(os.stat(path).st_mode) perm = '' usr, grp = '', '' size = os.stat(path).st_size date = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(os.stat(path).st_mtime)) if os.path.isfile(path): perm += '-' elif os.path.isdir(path): perm += 'd' else: perm += '?' perm += 'r' if mode & stat.S_IRUSR else '-' perm += 'w' if mode & stat.S_IWUSR else '-' perm += 'x' if mode & stat.S_IXUSR else '-' perm += 'r' if mode & stat.S_IRGRP else '-' perm += 'w' if mode & stat.S_IWGRP else '-' perm += 'x' if mode & stat.S_IXGRP else '-' perm += 'r' if mode & stat.S_IROTH else '-' perm += 'w' if mode & stat.S_IWOTH else '-' perm += 'x' if mode & stat.S_IXOTH else '-' try: usr = pwd.getpwuid(os.stat(path).st_uid).pw_name except KeyError: usr = str(os.stat(path).st_uid) try: grp = grp.getgrgid(os.stat(path).st_gid).gr_name except KeyError: grp = str(os.stat(path).st_gid) print("%s %2d %8s %8s %8d %21s %s" % (perm, os.stat(path).st_nlink, usr, grp, size, date, file)) if __name__ == '__main__': if len(sys.argv) == 1: ls_l('.') else: ls_l(sys.argv[1]) 以上代码先判断文件类型(文件或目录),然后根据文件权限、所有权、大小和创建时间等信息输出详细信息。可以在命令行中执行“python ls_l.py /home/user/”命令来列出目录中的所有文件和子目录的详细信息。 ### 回答3: ls -l是一个经常使用的命令,它能够列出当前目录下所有的文件和文件夹,并且显示详细的信息,包括文件名、权限、所有者、组、文件大小、修改时间等等。那么在Linux下如何实现类似的功能呢?下面我将给出一个简单的实现过程。 首先,我们需要使用C语言来编写这个程序。在程序中,我们需要调用一些系统函数来实现相应的功能,例如opendir()、readdir()、stat()、closedir()等等。下面是一个简单的代码框架: ``` #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys/stat.h> #include <time.h> #include <pwd.h> #include <grp.h> int main(int argc, char *argv[]) { DIR *dir; struct dirent *entry; struct stat statbuf; struct passwd *pw; struct group *gr; char buf[1024]; time_t t; //打开目录 if (argc == 1) { dir = opendir("."); } else if (argc == 2) { dir = opendir(argv[1]); chdir(argv[1]); } else { printf("usage: myls [dirname]\n"); exit(1); } //遍历目录 while ((entry = readdir(dir)) != NULL) { if (lstat(entry->d_name, &statbuf) == -1) { perror("lstat"); exit(1); } //获取文件类型和权限 switch (statbuf.st_mode & S_IFMT) { case S_IFREG: printf("-"); break; case S_IFDIR: printf("d"); break; case S_IFLNK: printf("l"); break; default: printf("?"); break; } printf("%c%c%c%c%c%c%c%c%c ", (statbuf.st_mode & S_IRUSR) ? 'r' : '-', (statbuf.st_mode & S_IWUSR) ? 'w' : '-', (statbuf.st_mode & S_IXUSR) ? 'x' : '-', (statbuf.st_mode & S_IRGRP) ? 'r' : '-', (statbuf.st_mode & S_IWGRP) ? 'w' : '-', (statbuf.st_mode & S_IXGRP) ? 'x' : '-', (statbuf.st_mode & S_IROTH) ? 'r' : '-', (statbuf.st_mode & S_IWOTH) ? 'w' : '-', (statbuf.st_mode & S_IXOTH) ? 'x' : '-'); //获取硬链接数、所有者和组名、文件大小和修改时间 printf("%2d ", (int)statbuf.st_nlink); pw = getpwuid(statbuf.st_uid); printf("%s ", pw->pw_name); gr = getgrgid(statbuf.st_gid); printf("%s ", gr->gr_name); printf("%5d ", (int)statbuf.st_size); t = statbuf.st_mtime; strftime(buf, sizeof(buf), "%b %d %H:%M", localtime(&t)); printf("%s ", buf); //输出文件名 printf("%s\n", entry->d_name); } //关闭目录 closedir(dir); return 0; } ``` 以上是一段简单的代码框架,我们可以在此基础上进一步完善和优化程序。程序的主要思路是遍历目录下的所有文件和文件夹,依次获取它们的详细信息并打印出来。其中需要注意的细节有很多,例如文件类型和权限的获取、所有者和组名的获取、文件大小和修改时间的格式化等等。通过认真学习和实践,我们可以深入了解Linux系统的原理和机制,进一步提升我们的编程水平和理解能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值