自主实现ls -al命令

ls (options) (参数)

1、options即为选项,常见的选项有如下…

-a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出);

-A:显示除影藏文件“.”和“..”以外的所有文件列表;

-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符;

-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;

-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;

-k:以KB(千字节)为单位显示文件大小;

-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等;

-r:以文件名反序排列并输出目录内容列表;

-s:显示文件和目录的大小,以区块为单位;

-t:用文件和目录的更改时间排序;

-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;

-R:递归处理,将指定目录下的所有文件及子目录一并处理;

注:选项可以多个进行组合使用,具体可实践查看效果。

2、参数
参数为要显示的路径或文件,如不指定则为当前路径。

3、代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <pwd.h>
#include <time.h>
//获取类型
void f_type(const struct stat *s)
{
	switch(s->st_mode & S_IFMT)
	{
		case S_IFSOCK: printf("s");break;
		case S_IFLNK: printf("l");break;
		case S_IFREG: printf("-");break;
		case S_IFBLK: printf("b");break;
		case S_IFDIR: printf("d");break;
		case S_IFCHR: printf("c");break;
		case S_IFIFO: printf("p");break;
	}
}

//获取权限
void f_mode(const struct stat* s)
{
	printf("%c",s->st_mode&S_IRUSR ? 'r':'-');
	printf("%c",s->st_mode&S_IWUSR ? 'w':'-');
	printf("%c",s->st_mode&S_IXUSR ? 'x':'-');
	
	printf("%c",s->st_mode&S_IRGRP ? 'r':'-');
	printf("%c",s->st_mode&S_IWGRP ? 'w':'-');
	printf("%c",s->st_mode&S_IXGRP ? 'x':'-');

	printf("%c",s->st_mode&S_IROTH ? 'r':'-');
	printf("%c",s->st_mode&S_IWOTH ? 'w':'-');
	printf("%c",s->st_mode&S_IXOTH ? 'x':'-');
}

//计算目录文件层数
int dir_level(const char *path)
{
	int count=0;
	DIR* dir=opendir(path);
	if(NULL==dir) return -1;

	for(struct dirent* d=readdir(dir);d!=NULL;d=readdir(dir))
	{
		count+=(d->d_type==DT_DIR);
	}
	closedir(dir);
	dir=NULL;
	return count;
}

//获取属主/属组名
void f_list(const struct  stat* s)
{
	struct passwd* name=NULL;
	name=getpwuid(s->st_uid);
	printf(" %s",name->pw_name);

	name=getpwuid(s->st_gid);
	printf(" %s",name->pw_name);
}

//获取文件所占字节数
void f_size(const struct stat* s)
{
	printf(" %4ld",s->st_size);
}

//获取文件时间
void f_time(const struct stat* s)
{
	time_t time=s->st_mtim.tv_sec;
	struct tm *t=localtime(&time);
	printf(" %2d月",t->tm_mon+1);
	printf(" %2d",t->tm_mday);
	printf(" %2d:%2d",t->tm_hour,t->tm_min);
}

//获取文件名
void f_name(const struct stat* s)
{
	
}

//对文件path进行ls -al
void list_file_stat(const char *path)
{
	//获取文件属性
	struct stat buf;
	if(stat(path,&buf))
	{
		perror("stat");
		return;
	}

	f_type(&buf);
	f_mode(&buf);
	printf(" %2d",S_ISDIR(buf.st_mode)? dir_level(path):1);
	f_list(&buf);
	f_size(&buf);
	f_time(&buf);
}
int main(int argc,const char* argv[])
{
	DIR* dir=NULL;
	if(argc==1)
		dir=opendir(".");
	else
	{
		dir=opendir(argv[1]);
		//更改当前工作路径
		chdir(argv[1]);
	}

	for(struct dirent* d=readdir(dir);d!=NULL;d=readdir(dir))
	{
		
		list_file_stat(d->d_name);
		printf(" %s\n",d->d_name);
	}
	return 0;
}

4、运行结果如下:

系统指令ls -al:

<think>好的,用户现在问的是`ls -al`命令,我需要详细解释这个命令的作用、参数含义以及输出内容。首先,`ls`是Linux/Unix系统中用于列出目录内容的基础命令,而`-al`是两个参数的组合:`-a`和`-l`。我需要分别解释这两个参数的作用,然后说明组合后的效果。 首先,`-a`参数的作用是显示所有文件和目录,包括以`.`开头的隐藏文件和目录,因为默认情况下`ls`会忽略它们。然后,`-l`参数是长格式列表,会显示文件的详细信息,比如权限、硬链接数、所有者、所属组、大小、修改时间和文件名等。 接下来,我需要解释`ls -al`的输出各列的含义。例如,第一列是文件类型和权限,分为10个字符,第一个字符表示类型(如`-`是普通文件,`d`是目录,`l`是符号链接等),接下来的9个字符分为三组,分别是所有者、所属组和其他用户的读、写、执行权限。第二列是硬链接数,第三列是所有者,第四列是所属组,第五列是文件大小(字节),第六列是最后修改时间,最后是文件名或目录名。 然后,可能需要举一个示例输出,并逐行解释各部分的意义,帮助用户理解。同时,需要注意一些细节,比如隐藏文件(如`.bashrc`)会被显示出来,目录的权限与文件的区别,符号链接的显示方式(可能带有箭头指向目标)等。 另外,用户可能想知道`ls -al`的常见使用场景,比如查看当前目录的所有文件(包括隐藏文件)的详细信息,检查文件权限是否正确,确认文件的所有者或修改时间等。 还需要注意一些相关参数,比如`-h`(以人类可读的格式显示文件大小,如KB、MB)通常和`-l`一起使用,即`ls -ahl`,但用户的问题是`-al`,所以可能需要提到这一点作为扩展。 最后,确保回答结构清晰,先总述命令的作用,再分参数解释,然后详细说明输出各列的含义,可能的示例,以及常见用途。同时,按照要求,在回答末尾生成3-5个相关问题。 </think>`ls -al` 是Linux/Unix系统中用于**列出目录下所有文件(含隐藏文件)的详细信息**的命令。它是 `ls` 命令与两个参数 `-a` 和 `-l` 的组合,以下是具体解析: ### 1. 参数含义 - **`-a`(all)**:显示目录下的**所有文件和子目录**,包括以 `.` 开头的隐藏文件(如 `.bashrc`、`.ssh` 等)。默认情况下,`ls` 会忽略隐藏文件(因Unix传统中隐藏文件用于配置,用户通常不频繁操作)。 - **`-l`(long format)**:以**长格式列表**显示文件信息,包含权限、硬链接数、所有者、所属组、大小、修改时间等详细属性。 ### 2. 输出示例与字段解释 执行 `ls -al` 后,输出通常如下(以用户家目录为例): ```bash $ ls -al total 64 drwxr-xr-x 6 user user 4096 7月 10 15:30 . drwxr-xr-x 23 root root 4096 7月 8 10:20 .. -rw------- 1 user user 2345 7月 5 09:12 .bash_history -rw-r--r-- 1 user user 220 4月 12 2022 .bash_logout drwx------ 2 user user 4096 6月 25 18:30 .cache lrwxrwxrwx 1 user user 24 7月 1 14:00 doc -> /mnt/data/shared/doc -rw-r--r-- 1 user user 8980 4月 12 2022 examples.desktop drwxr-xr-x 3 user user 4096 5月 20 11:45 projects ``` #### 各列字段详细说明(从左到右): 1. **文件类型与权限(第1列)**:共10个字符。 - 第1位:文件类型。常见类型: - `-`:普通文件(如文本、二进制程序); - `d`:目录(如 `.cache`、`projects`); - `l`:符号链接(软链接,如 `doc`); - `b`:块设备(如硬盘 `/dev/sda`); - `c`:字符设备(如串口 `/dev/tty`)。 - 第2-10位:权限,分为三组(每组3位),依次是**所有者(user)、所属组(group)、其他用户(others)**的读(`r`)、写(`w`)、执行(`x`)权限。 - 示例 `rwxr-xr--` 表示:所有者可读、写、执行;所属组可读、执行;其他用户仅可读。 2. **硬链接数(第2列)**:文件或目录的硬链接数量。对文件而言,是指向同一inode的文件名数量;对目录而言,是子目录数+1(自身和父目录的链接)。 3. **所有者(第3列)**:文件的拥有者用户名(如 `user`)。 4. **所属组(第4列)**:文件所属的用户组名(如 `user` 组)。 5. **文件大小(第5列)**:文件占用的磁盘空间(单位:字节)。若为目录,显示的是目录元数据(如索引节点)的大小(非目录内所有文件的总大小)。 6. **最后修改时间(第6-8列)**:文件内容最后被修改的时间(格式:月份 日期 时间,如 `7月 10 15:30`)。 7. **文件名/目录名(第9列)**:文件或目录的名称。符号链接会额外显示指向的目标(如 `doc -> /mnt/data/shared/doc`)。 ### 3. 常见用途 - 查看隐藏文件(如配置文件 `.bashrc`)的详细信息; - 检查文件权限是否符合预期(如确保敏感文件无其他用户写权限); - 确认文件的所有者或修改时间(如排查文件被意外修改的问题); - 识别符号链接及其指向的目标路径。 ### 注意 - 若需以“人类可读”的格式显示文件大小(如KB、MB),可添加 `-h` 参数(即 `ls -ahl`),此时第5列会显示为 `2.3K`、`4.5M` 等。 - 输出中的 `.` 表示当前目录,`..` 表示父目录,所有目录的硬链接数至少为2(自身和父目录的链接)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值