LINUX LS命令(LS命令模拟)
ls命令详解

ls命令是Linux常用命令之一,ls命令的作用和windows系统的dir命令类似,下面我们详细介绍一下ls命令的使用方法:ls是英文单词list的简写,其功能为列出目录的内容。
这是用户最常用的一个命令之一,因为用户需要不时地查看某个目录的内容。
该命令类似于DOS下的dir命令。
语法:ls [选项] [目录或是文件]对于每个目录,该命令将列出其中的所有子目录与文件。
对于每个文件,ls将输出其文件名以及所要求的其他信息。
默认情况下,输出条目按字母顺序排序。
当未给出目录名或是文件名时,就显示当前目录的信息。
命令中各选项的含义如下:- a 显示指定目录下所有子目录与文件,包括隐藏文件。
- A 显示指定目录下所有子目录与文件,包括隐藏文件。
但不列出“.”和“..”。
- b 对文件名中的不可显示字符用八进制逃逸字符显示。
- c 按文件的修改时间排序。
- C 分成多列显示各项。
- d 如果参数是目录,只显示其名称而不显示其下的各文件。
往往与l选项一起使用,以得到目录的详细信息。
- f 不排序。
该选项将使lts选项失效,并使aU选项有效。
- F 在目录名后面标记“/”,可执行文件后面标记“*”,符号链接后面标记“@”,管道(或FIFO)后面标记“|”,socket文件后面标记“=”。
- i 在输出的第一列显示文件的i节点号。
- l 以长格式来显示文件的详细信息。
这个选项最常用。
每行列出的信息依次是:文件类型与权限链接数文件属主文件属组文件大小建立或最近修改的时间名字对于符号链接文件,显示的文件名之后有“—〉”和引用文件路径名。
对于设备文件,其“文件大小”字段显示主、次设备号,而不是文件大小。
目录中的总块数显示在长格式列表的开头,其中包含间接块。
- L 若指定的名称为一个符号链接文件,则显示链接所指向的文件。
- m 输出按字符流格式,文件跨页显示,以逗号分开。
- n 输出格式与l选项相同,只不过在输出中文件属主和属组是用相应的UID号和 GID 号来表示,而不是实际的名称。
Linux系统中ls命令详解

Linux系统中ls命令用法详解ls命令是linux下最常用的命令。
ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单,如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单。
通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限),查看目录信息等等,ls 命令在日常的linux操作中用的很多,在此给大家介绍一下ls 命令的使用方法。
一、ls命令使用介绍ls命令格式:ls [选项] [目录名].ls命令功能:列出目标目录中所有的子目录和文件。
ls 命令的参数选项说明:-a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件。
-A, –almost-all 列出除了 . 及以外的任何项目–author 印出每个文件的作者-b, –escape 把文件名中不可输出的字符用反斜杠加字符编号的形式列出。
–block-size=大小块以指定<大小>的字节为单位-B, –ignore-backups 不列出任何以~ 字符结束的项目-c 输出文件的ctime (文件状态最后更改的时间),并根据ctime 排序。
-C 每栏由上至下列出项目–color[=WHEN] 控制是否使用色彩分辨文件。
WHEN 可以是'never'、'always'或'auto'其中之一-d, –directory 将目录象文件一样显示,而不是显示其下的文件。
-D, –dired 产生适合Emacs 的dired 模式使用的结果-f 对输出的文件不进行排序,-aU 选项生效,-lst 选项失效-F, –classify 加上文件类型的指示符号(*/=@| 其中一个)–format=关键字across -x,commas -m,horizontal -x,long -l,single-column -1,verbose -l,vertical -C–full-time 即-l –time-style=full-iso-g 类似-l,但不列出所有者-G, –no-group 不列出任何有关组的信息-h, –human-readable 以容易理解的格式列出文件大小(例如1K 234M 2G)–si 类似-h,但文件大小取1000 的次方而不是1024-H, –dereference-command-line 使用命令列中的符号链接指示的真正目的地–indicator-style=方式指定在每个项目名称后加上指示符号<方式>:none (默认),classify (-F),file-type (-p)-i, –inode 印出每个文件的inode 号-I, –ignore=样式不印出任何符合shell 万用字符<样式>的项目-k 即–block-size=1K,以k 字节的形式表示文件的大小。
linux中ls命令的作用

linux中ls命令的作用ls是linux系统中的一个常见命令,用于显示当前目录下的文件和子目录。
ls命令可以给出对文件和目录的一些简单信息,如文件的名字、文件的大小、文件创建时间等。
该命令常常与其他参数结合使用。
常用的参数如下:-a 显示所有文件和子目录(包括隐藏文件)。
-l 以列表方式显示,显示文件的详细信息。
-t 以文件修改时间排序。
-h 以易读方式显示文件的大小。
-i 显示文件的i节点号。
-d 显示目录名,而非目录下的文件。
1.显示文件名如果不加任何参数,则ls命令默认显示当前目录下的所有文件名,包含子目录中的文件名。
例如:$ ls该命令将显示当前目录下的所有文件及子目录。
2.显示目录如果只想查看所在目录的文件夹名,可以加上“-d”参数。
在Linux中,以“.”开头的文件为隐藏文件。
如果要显示所有文件(包括隐藏文件),可以使用“-a”参数。
4.显示文件详细信息使用“-l”参数可以显示文件的详细信息,包括文件的权限、所有者、文件大小、创建时间等等。
-rw-rw-r-- 1 lianghongping lianghongping 558651 Oct 8 10:05 text.txt其中“-rw-rw-r--”代表文件的权限信息,“lianghongping”代表所有者和所属组,“558651”代表文件大小,“Oct 8 10:05”代表文件的创建时间,“text.txt”代表文件名。
在命令行中,文件大小的单位是以字节为单位的。
使用“-h”参数可以以更易读的方式显示文件大小。
$ ls -d */Linux中ls命令的作用就是列出当前目录下的文件名,包含子目录中的文件名,并且还可以通过参数对列出的结果进行排序、筛选等操作。
无论是在命令行下,还是在图形界面下,我们都会经常用到这个命令。
使用ls命令列出Linux终端中的文件和目录

使用ls命令列出Linux终端中的文件和目录在Linux操作系统中,ls命令是非常常用的一个命令,它能够将当前目录下的文件和目录列出来。
在本文中,我将详细介绍ls命令的使用方法,并演示一些常用的选项和参数。
1. 基本用法要使用ls命令列出当前目录下的文件和目录,只需在终端中输入ls,然后按下回车键即可。
ls命令会将结果以列表形式显示,每一行对应一个文件或目录。
示例:```shell$ ls```2. 列出目录如果想要列出指定目录下的文件和目录,只需在ls命令后面跟上目录的路径即可。
路径可以是相对路径或绝对路径。
示例:```shell$ ls /home/user/Documents```3. 列出隐藏文件在Linux系统中,以"."开头的文件被视为隐藏文件,ls命令默认情况下不会列出这些文件。
如果想要显示隐藏文件,可以使用选项"-a"或"--all"。
示例:```shell$ ls -a```4. 列出详细信息ls命令默认以简要形式列出文件和目录,如果想要查看更详细的信息,可以使用选项"-l"或"--long"。
这样,ls命令会以长格式显示每个文件和目录的详细属性。
示例:```shell$ ls -l```5. 列出文件大小如果想要查看文件的大小,可以结合使用选项"-l"和"-h"。
选项"-l"会显示文件的详细信息,"-h"会以人类可读的方式显示文件大小(例如,使用KB、MB、GB等单位)。
示例:```shell$ ls -lh```6. 按时间排序ls命令还可以根据文件的修改时间进行排序。
使用选项"-t",ls命令会将最近修改的文件显示在最前面。
示例:```shell$ ls -lt```7. 列出子目录当遇到目录时,ls命令默认只会列出目录的名称,而不会递归地列出其中的内容。
linux ls命令的用法

linux ls命令的用法LS(List)命令是Linux操作系统中最基本和最常用的命令之一,用于列出指定目录下的文件和子目录。
它可以帮助用户快速查看目录中的文件列表,并提供一些附加选项以满足用户的不同需求。
本文将详细介绍LS命令的用法,包括常用选项和参数,以及一些实用的技巧和案例。
一、基本用法1. 使用ls命令最简单的方式是在命令行中输入“ls”后回车,此时将会列出当前目录中的文件和子目录。
2. 如果需要查看指定目录下的文件列表,可以在ls命令后面添加目录路径来实现。
例如,“ls /home”将会列出家目录下的文件和子目录。
3. 若想查看隐藏文件(以点开头的文件),可以使用“ls -a”命令。
例如,“ls -a /home”将包括所有文件和子目录,包括隐藏文件。
二、常用选项1. -l:使用长格式(long format)输出,将会显示文件的详细信息,包括权限、所有者、文件大小、修改日期等。
2. -t:按照修改时间倒序排列文件。
使用“ls -lt”命令将根据最后修改时间将文件列表显示在最前面。
3. -r:以相反的顺序显示文件。
使用“ls -r”命令可以实现将文件从最后一个显示到第一个。
4. -S:根据文件大小(以字节为单位)进行排序,最大的文件将会显示在最前面。
使用“ls -S”命令可以实现这一功能。
5. -h:以人类可读的文件大小格式显示,即以具有单位的形式进行显示(如1K、10M等)。
使用“ls -lh”命令可以实现这一功能。
6. -d:列出目录本身,而不是目录下的内容。
使用“ls -d”命令可以只显示目录的信息。
7. color=auto:自动根据文件类型显示不同的颜色。
默认情况下是关闭的,可以通过将其加入到ls命令后开启。
(注:颜色显示需要终端支持)三、常用参数1. -R:递归列出指定目录下的所有子目录和文件。
使用“ls -R”命令可以列出目录树中的所有文件和子目录。
2. -a:显示所有文件和子目录,包括以点开头的隐藏文件。
Linux命令ls-l输出内容含义详解

Linux命令ls-l输出内容含义详解1. ls 只显⽰⽂件名或者⽂件⽬录2. ls -l(这个参数是字母L的⼩写,不是数字1)⽤来查看详细的⽂件资料在某个⽬录下键⼊ls -l可能会显⽰如下信息:⽂件属性(占10个字符空间) ⽂件数拥有者所属的group ⽂件⼤⼩建档⽇期⽂件名drwx------ 2 Guest users 1024 Nov 21 21:05 Mail -rwx--x--x 1 root root 89080 Nov 7 22:41 tar* -rwxr-xr-x 1 root bin 5013 Aug 15 9:32 uname* lrwxrwxrwx 1 root root 4 Nov 24 19:30 zcat->gzip -rwxr-xr-x 1 root bin 308364 Nov 29 7:43 zsh* -rwsr-x--- 1 root bin 9853 Aug 15 5:46 su*-rw-r--r-- 1 Hhf 197121 146 10⽉ 18 17:37 main.m这些显⽰内容的意义: 第⼀个栏位,表⽰⽂件的属性。
Linux的⽂件基本上分为三个属性:可读(r),可写(w),可执⾏(x)。
但是这⾥有⼗个格⼦可以添(具体程序实现时,实际上是⼗个bit位)。
第⼀个⼩格是特殊表⽰格,表⽰⽬录或连结⽂件等等,d表⽰⽬录,例如drwx------;l表⽰连结⽂件,如lrwxrwxrwx;如果是以⼀横“-”表⽰,则表⽰这是⽂件。
其余剩下的格⼦就以每3格为⼀个单位。
因为Linux是多⽤户多任务系统,所以⼀个⽂件可能同时被许多⼈使⽤,所以我们⼀定要设好每个⽂件的权限,其⽂件的权限位置排列顺序是(以-rwxr-xr-x为例): rwx(Owner)r-x(Group)r-x(Other) 这个例⼦表⽰的权限是:使⽤者⾃⼰可读,可写,可执⾏;同⼀组的⽤户可读,不可写,可执⾏;其它⽤户可读,不可写,可执⾏。
Linux基本命令-ls

Linux基本命令-lsls作⽤:显⽰⽬标列表,在Linux中是使⽤率较⾼的命令。
ls命令的输出信息可以进⾏彩⾊加亮显⽰,以分区不同类型的⽂件。
参数:-a:显⽰所有档案及⽬录(ls内定将档案名或⽬录名称为“.”的视为影藏,不会列出);-A:显⽰除影藏⽂件“.”和“..”以外的所有⽂件列表;-C:多列显⽰输出结果。
这是默认选项;-l:与“-C”选项功能相反,所有输出信息⽤单列格式输出,不输出为多列;-F:在每个输出项后追加⽂件的类型标识符,具体含义:“*”表⽰具有可执⾏权限的普通⽂件,“/”表⽰⽬录,“@”表⽰符号链接,“|”表⽰命令管道FIFO,“=”表⽰sockets套-b:将⽂件中的不可输出的字符以反斜线“”加字符编码的⽅式输出;-c:与“-lt”选项连⽤时,按照⽂件状态时间排序输出⽬录内容,排序的依据是⽂件的索引节点中的ctime字段。
与“-l”选项连⽤时,则排序的⼀句是⽂件的状态改变时间;-d:仅显⽰⽬录名,⽽不显⽰⽬录下的内容列表。
显⽰符号链接⽂件本⾝,⽽不显⽰其所指向的⽬录列表;-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;-i:显⽰⽂件索引节点号(inode)。
⼀个索引节点代表⼀个⽂件;--file-type:与“-F”选项的功能相同,但是不显⽰“*”;-k:以KB(千字节)为单位显⽰⽂件⼤⼩;-l:以长格式显⽰⽬录下的内容列表。
输出的信息从左到右依次包括⽂件名,⽂件类型、权限模式、硬连接数、所有者、组、⽂件⼤⼩和⽂件的最后修改时间等;-m:⽤“,”号区隔每个⽂件和⽬录的名称;-n:以⽤户识别码和群组识别码替代其名称;-r:以⽂件名反序排列并输出⽬录内容列表;-s:显⽰⽂件和⽬录的⼤⼩,以区块为单位;-t:⽤⽂件和⽬录的更改时间排序;-L:如果遇到性质为符号链接的⽂件或⽬录,直接列出该链接所指向的原始⽂件或⽬录;-R:递归处理,将指定⽬录下的所有⽂件及⼦⽬录⼀并处理;--full-time:列出完整的⽇期与时间;--color[=WHEN]:使⽤不同的颜⾊⾼亮显⽰不同类型的。
掌握Linux终端命令ls命令用法指南

掌握Linux终端命令ls命令用法指南为了更好地掌握Linux终端命令的使用,特意为大家整理了关于ls 命令的使用指南。
通过本文的学习,你将能够熟练运用ls命令来查看文件和目录的信息,提高你在Linux系统下的工作效率。
一、ls命令的基本介绍ls命令是Linux系统中常用的命令之一,用于列出指定目录中的文件和子目录。
通过ls命令,我们可以快速查看当前目录下的文件及其相关信息,包括文件名、权限、大小、所有者、修改时间等。
在命令行中输入"ls"即可执行该命令。
二、ls命令的常用参数1. -l:以详细列表的形式显示文件和目录的信息。
每一行代表一个文件或目录,包括文件的权限、所有者、文件大小、修改日期等详细信息。
2. -a:显示所有文件,包括以"."开头的隐藏文件。
3. -h:人性化地显示文件大小,以较易读的单位显示,如KB、MB 等。
4. -r:以相反的顺序显示文件和目录。
5. -S:按文件大小进行排序,从大到小排列。
6. -t:按照修改时间进行排序,最近修改的文件在列表的最前面。
三、ls命令的使用示例1. ls:列出当前目录下的文件和文件夹。
2. ls -l:以详细列表形式显示当前目录下的文件和文件夹。
3. ls -a:显示当前目录下的所有文件和文件夹,包括隐藏文件。
4. ls -l -h:以较易读的单位显示当前目录下文件和文件夹的大小。
5. ls -l -r:以相反的顺序显示当前目录下的文件和文件夹。
6. ls -l -S:按文件大小从大到小的顺序显示当前目录下的文件和文件夹。
7. ls -l -t:按修改时间从近到远的顺序显示当前目录下的文件和文件夹。
四、ls命令的扩展用法1. ls [目录路径]:列出指定目录下的文件和文件夹。
2. ls *.txt:列出当前目录下所有以.txt为后缀名的文件。
3. ls -l | grep "关键词":在当前目录下列出文件和文件夹,并通过关键词进行筛选,只显示包含该关键词的文件和文件夹。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux-ls命令模拟////ls.c//wxd////create by jneeyou on15/11/13//Copyright(c)2015wxd.All rights reserved.//#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include"ls_fileHandle.h"/**主函数**/int main(int argc,char*argv[]){int mask=0;bool ret=false;freopen(".err.dat","wb",stderr);if(!init()){return-1;}mask=getCmdLineArgs(argc,argv);if(mask==-2)//--help命令{getHelpMenu();//显示帮助}else if(mask==ERROR){printf("参数有误,输入\"./ls--help\"查看帮助\n");}else//其他命令{setMaskArray(mask);ret=getDirInfo(".",0);if(!ret){printf("参数有误,输入\"./ls--help\"查看帮助\n");}freeMem();}system("rm-f.err.dat");return0;}////ls_fileHandle.h//wxd////create by jneeyou on15/11/13//Copyright(c)2015wxd.All rights reserved.//#ifndef__LS_FILE_HANDLE_H__#define__LS_FILE_HANDLE_H__//定义bool型#if!defined(bool)#define bool char#define true1#define false0#endif#ifndef ERROR#define ERROR-1#endif#if defined(__STDC__VERSION__)&&(__STDC__VERSION__>=199901L) //@desc宏函数,输出文件信息#define printf_c(fontBgColor,fontColor,format,args...) printf("\033[fontBgColor;fontColorm format\033[0m",args)#else//@desc输出文件信息//带颜色输出,可设置字体颜色和字体背景颜色extern int printf_c(char fontBgColor,char fontColor,const char*format,...);#endif//@desc获取命令行参数,返回掩码值extern int getCmdLineArgs(int argc,char*argv[]);//@desc设置掩码数组//@ret成功返回true,否则返回falseextern bool setMaskArray(int maskValue);//@desc获得文件信息//@ret成功返回true,否则返回falseextern bool getFileInfo(const char*dirName,const char*fileName,unsigned int index);//@desc获得目录信息//@ret成功返回true,否则返回falseextern bool getDirInfo(const char*dirName,int dirLevel);//@desc获得帮助菜单extern void getHelpMenu();//@desc释放内存void freeMem();//@desc初始化bool init();#endif//__LS_FILE_HANDLE_H__////ls_fileHandle.c//wxd////create by jneeyou on15/11/13//Copyright(c)2015wxd.All rights reserved. //#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/stat.h>#include<stdarg.h>#include<unistd.h>#include<dirent.h>#include<time.h>#include<math.h>#include<pwd.h>#include<grp.h>#include<sys/types.h>#ifndef ERROR#define ERROR-1#endif#define OK0#define NUL_POINTER NULL//定义bool,true,false#ifndef bool#define bool char#define true1#define false0#endif//帮助文件名#define HELP_FILE"helpInfo.dat"#define TMP_FILE".tmp~"//定义errno_t型#define errno_t int//定义文件类型#define block_file'b'#define direct_file'd'#define spec_char_file'c'#define fifo_device'p'#define regular_file'-'#define link_file'l'#define socket_file's'#define BF block_file//块文件#define DF direct_file//目录文件#define CF spec_char_file//特殊字符文件#define FD fifo_device//FIFO设备#define RF regular_file//普通文件#define LF link_file//符号链接文件#define SF socket_file//scoket文件//文件名最大长度#define MAX_FILE_NAME512//最多子目录个数#define MAX_SUB_DIR100//背景色typedef struct BG_COLOR{const char BLACK;//黑const char DARKRED;//深红const char GREEN;//绿const char YELLOW;//黄const char BLUE;//蓝const char PURPLE;//紫const char DARKGREEN;//深绿const char WHITE;//白const char DEFAULT;//默认}bgColor;//文字背景色static const bgColor font_bgColor={40,41,42,43,44,45,46,47,0};//前景色typedef struct FG_COLOR{const char BLACK;//黑const char RED;//红const char GREEN;//绿const char YELLOW;//黄const char BLUE;//蓝const char PURPLE;//紫const char DARKGREEN;//深绿const char WHITE;//白const char DEFAULT;//默认}fgColor;//文字颜色static const fgColor font_fgColor={30,31,32,33,34,35,36,37,0};//文件信息结构体typedef struct File_Info{ino_t ino;//节点号char type;//类型char perm[10];//权限nlink_t nlink;//硬链接数char uname[32];//用户名char gname[32];//所属组名off_t size;//大小time_t mtime;//最后修改时间char name[32];//文件名char lname[32];//链接的文件名char nameColor;//名字颜色char lnameColor;//链接文件颜色}fileInfo;#define MAX_FILE_NUM100//文件信息结构体数组static fileInfo*m_fileInfo=NULL;//已分配空间static unsigned int ALLOC_MEM_LEN=0;/////////////////////////////////////全局变量/////////////////////////////////////////////////掩码数组,根据每位元素值是否为1选择获取文件哪些//信息,每位元素对应一个ls命令参数,对应关系如下://maskArray[0]-->-l//maskArray[1]-->-a//maskArray[2]-->-R//maskArray[3]-->-r//maskArray[4]-->-d//maskArray[5]-->-i//maskArray[6]-->-S(大写S)//maskArray[7]-->-t//maskArray[8]-->-m//maskArray[9]-->-1(数字1)//maskArray[10]-->--help//maskArray[11]-->无参数//maskArray[12...15]-->保留static unsigned char maskArray[16]={0};//掩码数组有效长度#define VALID_LEN_ARRAY10//保存外部输入的文件名static char fileName[128][20]={""};//外部文件数目static int extFileNums=0;/////////////////////////////////////////////////////////////////////////////////////// ////////////////------------------------------------函数实现---------------------------------/////////////////////////////////////////////////////////////////////////////////////////////// ////////检查参数errno_t checkArgement(char arg){static const char allArgs[]={'l','a','R','r','d','i','S','t','m','1'};int len=strlen(allArgs);int i=0;for(i=0;i<len;i++){if(arg==allArgs[i])return i;}return ERROR;}//安全拷贝errno_t strcpy_s(char*_Dst,size_t_SizeInBytes,const char*_Src){char*ret=NULL;if(strlen(_Src)>_SizeInBytes){return ERROR;}ret=strcpy(_Dst,_Src);if(ret==NULL)return ERROR;return OK;}//安全打开errno_t fopen_s(FILE**_File,const char*_Filename,const char*_Mode){*_File=fopen(_Filename,_Mode);if(*_File==NULL)return ERROR;return OK;}//安全输出errno_t vsprintf_s(char*_DstBuf,size_t_SizeInBytes,const char*_Format,va_list _ArgList){errno_t ret=vsnprintf(_DstBuf,_SizeInBytes,_Format,_ArgList);return ret;}//获取命令行参数,返回掩码值int getCmdLineArgs(int argc,char*argv[]){int maskValue=0x0000;int fileCount=0;int i=0;for(i=1;i<argc;i++){if(!strcmp(argv[i],"--help")){return-2;}else if(argv[i][0]=='-'){int len=strlen(argv[i]);int ret=ERROR;while(--len){ret=checkArgement(argv[i][len]);if(ret==ERROR)return ERROR;maskValue|=(0x0001<<ret);}}else{strcpy_s(fileName[fileCount++],sizeof(fileName[0]),argv[i]);}}extFileNums=fileCount;return maskValue;}//设置掩码数组bool setMaskArray(int maskValue){long tmp=0x10000;int i=15;memset(maskArray,0,sizeof(maskArray));if(maskValue==0){maskArray[11]=1;return true;}while(!((tmp>>=1)&maskValue)&&tmp>0)i--;while(tmp>0){if(tmp&maskValue){maskArray[i--]=1;}else{maskArray[i--]=0;}tmp>>=1;}return true;}#if!(defined(__STDC__VERSION__)&&__STDC__VERSION__>=199901L)//@desc宏函数,带颜色输出,#format,将format对应的参数字符串化(为变量名时,不是变量中的值,而是变量名)#define PRINT_BY_COLOR(fontBgColor,Bold,fontColor,format,argsValue)printf("\033[%d;%02d;%dm"#format"\033[0m",fontBgColor,Bold,fontColor,argsValue)//输出文件信息int printf_c(char fontBgColor,char fontColor,const char*format,...){static char printf_buf[1024];va_list args;int n=0;int bold=0;va_start(args,format);n=vsprintf_s(printf_buf,sizeof(printf_buf),format,args);va_end(args);if(fontBgColor<40||fontBgColor>47){fontBgColor=font_bgColor.DEFAULT;}if(fontColor<30||fontColor>37){fontBgColor=font_fgColor.DEFAULT;}if(fontColor==font_fgColor.BLACK){bold=0;}PRINT_BY_COLOR(fontBgColor,bold,fontColor,"%s",printf_buf);return n;}#endif//通过uid获得用户名char*getUnameByUid(uid_t uid){struct passwd*m_pw;static char name[20]="";m_pw=getpwuid(uid);if(m_pw==NULL){return NUL_POINTER;}strcpy_s(name,sizeof(name),m_pw->pw_name);return name;}//通过gid获得组名char*getGnameByGid(gid_t gid){struct group*m_gr;static char name[20]="";m_gr=getgrgid(gid);if(m_gr==NULL){return NUL_POINTER;}strcpy_s(name,sizeof(name),m_gr->gr_name);return name;}//获取符号链接链接的文件名bool getFileNameBySLink(char*sLinkName,char*buf,size_t bufSize) {int len=0;len=readlink(sLinkName,buf,bufSize);buf[len]='\0';if(len>bufSize){perror("文件名过长,已被截取.");}return true;}//获取文件访问权限char*getFileAccePermis(mode_t st_mode){static char perm[9]="";char permValue[4]="xwr-";int i=0,len=9;for(i=0;i<len;i++){if(st_mode&(0x1<<i)){perm[len-i-1]=permValue[i%3];}else{perm[len-i-1]=permValue[3];}}return perm;}//获取文件类型char getFileType(mode_t st_mode){switch(st_mode&S_IFMT){case S_IFBLK:return BF;case S_IFDIR:return DF;case S_IFCHR:return CF;case S_IFIFO:return FD;case S_IFREG:return RF;case S_IFLNK:return LF;case S_IFSOCK:return SF;default:return ERROR;}}//通过文件类型获得文件名颜色char getFileColorByType(const char*fileName,char type){char cmd[3][512];char ret=font_fgColor.BLACK;if(type==DF)return font_fgColor.BLUE;if(type==LF)return font_fgColor.DARKGREEN;if(access(fileName,X_OK)==0)return font_fgColor.GREEN;//测试是否为压缩文件if(!system("mkdir tmp~")){sprintf(cmd[0],"tar-xf%s-C tmp~",fileName);sprintf(cmd[1],"tar-xzf%s-C tmp~",fileName);sprintf(cmd[2],"tar-xjf%s-C tmp~",fileName);if(!system(cmd[0])||!system(cmd[1])||!system(cmd[2])){ret=font_fgColor.RED;}}system("rm-Rf tmp~");return ret;}//获得文件信息bool getFileInfo(const char*dirName,const char*fileName,unsigned int index) {struct stat fileStat;char name[50];sprintf(name,"%s/%s",dirName,fileName);//数组已装满if(index>=ALLOC_MEM_LEN){m_fileInfo=(fileInfo*)realloc(m_fileInfo,sizeof(fileInfo)*ALLOC_MEM_LEN*2);ALLOC_MEM_LEN*=2;}//获取文件信息int ret=lstat(name,&fileStat);if(ret==-1){return false;}//节点号m_fileInfo[index].ino=fileStat.st_ino;//文件类型m_fileInfo[index].type=getFileType(fileStat.st_mode);//文件权限strcpy_s(m_fileInfo[index].perm,sizeof(m_fileInfo[index].perm), getFileAccePermis(fileStat.st_mode));//硬链接数m_fileInfo[index].nlink=fileStat.st_nlink;//用户名strcpy_s(m_fileInfo[index].uname,sizeof(m_fileInfo[index].uname), getUnameByUid(fileStat.st_uid));//组名strcpy_s(m_fileInfo[index].gname,sizeof(m_fileInfo[index].gname), getGnameByGid(fileStat.st_gid));//文件大小m_fileInfo[index].size=fileStat.st_size;//上次修改时间m_fileInfo[index].mtime=fileStat.st_mtime;return true;}//自定义排序函数int cmp(const void*a,const void*b){char tmpA,tmpB;fileInfo*fileInfoA=(fileInfo*)a;fileInfo*fileInfoB=(fileInfo*)b;if(maskArray[7]==1){return fileInfoA->mtime-fileInfoB->mtime;}else if(maskArray[6]==1){return fileInfoA->size-fileInfoB->size;}tmpA=fileInfoA->name[0];if(tmpA>='A'&&tmpA<='Z'){tmpA+='a'-'A';}tmpB=fileInfoB->name[0];if(tmpB>='A'&&tmpB<='Z'){tmpB+='a'-'A';}if(maskArray[3]==1){return tmpB-tmpA;}else{return tmpA-tmpB;}}//文件排序void sortFiles(fileInfo*pFileInfoArray,int elemNum){qsort(pFileInfoArray,elemNum,sizeof(pFileInfoArray[0]),cmp);}//移动输出位置void moveOutPos(int row,int col){char hori='A';//向上char vert='C';//向右if(row<0)//向下{hori='B';row=-row;}if(col<0)//向左{vert='D';col=-col;}printf("\033[%d%c\033[%d%c",row,hori,col,vert);}//通过掩码数组输出文件//返回输出内容长度int outFileByMaskArray(fileInfo cur_fileInfo,unsigned char maskArray[]) {int outputFlag=0;//是否输出标志char outStr[1024]="";//输出字符串int i=0;int len=0;//不带参数情况if(maskArray[11]==1){printf_c(font_bgColor.DEFAULT,cur_Color,"%s",cur_);return strlen(cur_);}//-l命令,长格式输出if(maskArray[0]){struct tm*mTime=localtime(&cur_fileInfo.mtime);char str[20]="";sprintf(str,"%4d.%02d.%02d%02d:%02d:%02d",mTime->tm_year+1900,mTime->tm_mon+1,mTime->tm_mday,mTime->tm_hour,mTime->tm_min,mTime->tm_sec);sprintf(outStr,"%c%s.%d%s%s%-8d%s",cur_fileInfo.type,cur_fileInfo.perm,cur_fileInfo.nlink,cur_fileInfo.uname,cur_fileInfo.gname,cur_fileInfo.size,str);}//-i命令,输出节点号inoif(maskArray[5]){char tmp[512]="";strcpy_s(tmp,sizeof(tmp),outStr);sprintf(outStr,"%d%s",cur_fileInfo.ino,tmp);}len=strlen(outStr);printf("%s",outStr);//输出文件信息if(maskArray[0]){printf("");len+=2;}len+=strlen(cur_);printf_c(font_bgColor.DEFAULT,cur_Color,"%s",cur_);//-l格式下的输出链接文件指向的文件if(maskArray[0]&&cur_fileInfo.type==LF){printf("->");printf_c(font_bgColor.DEFAULT,cur_fileInfo.lnameColor,"%s",cur_fileInfo.lname);len+=strlen(cur_fileInfo.lname)+4;}return len;}//获得目录信息bool getDirInfo(const char*dirName,int dirLevel){DIR*curDir=opendir(dirName);char linkedFile[MAX_FILE_NAME]="";char subDirFile[MAX_SUB_DIR][MAX_FILE_NAME];//保存目录文件int cnt_subDir=0;//子目录数int cnt_dirFiles=0;//目录下文件数int i=0,ret=0;static firCallFlag=1;//第一次调用标记int total_size=0;char tmp[MAX_FILE_NAME]="";struct stat m_stat;if(curDir==NULL){return false;}//-R命令时首先输出目录名if(maskArray[2]){for(i=0;i<dirLevel;i++){printf("\t");}printf("%s:\n",dirName);}struct dirent*m_dirent=NULL;while((m_dirent=readdir(curDir))!=NULL){if(!strcmp(".err.dat",m_dirent->d_name)){continue;}if(!strcmp(dirName,".")&&extFileNums>0){for(i=0;i<extFileNums;i++){if(!strcmp(fileName[i],m_dirent->d_name)){break;}}firCallFlag=0;if(i==extFileNums)continue;}//非-a命令时跳过隐藏文件if(m_dirent->d_name[0]=='.'&&maskArray[1]!=1){continue;}ret=getFileInfo(dirName,m_dirent->d_name,cnt_dirFiles);if(!ret||!strcmp(m_dirent->d_name,""))break;//-d命令跳过非目录文件if(maskArray[4]==1&&m_fileInfo[cnt_dirFiles].type!=DF) {continue;}sprintf(tmp,"%s/%s",dirName,m_dirent->d_name);strcpy_s(m_fileInfo[cnt_dirFiles].name,sizeof(m_fileInfo[cnt_dirFiles].name),m_dirent->d_name); m_fileInfo[cnt_dirFiles].nameColor=getFileColorByType( tmp,m_fileInfo[cnt_dirFiles].type);//获得链接的目标文件名if(m_fileInfo[cnt_dirFiles].type==LF){getFileNameBySLink(tmp,linkedFile,sizeof(linkedFile));strcpy_s(m_fileInfo[cnt_dirFiles].lname,sizeof(m_fileInfo[cnt_dirFiles].lname),linkedFile);lstat(linkedFile,&m_stat);sprintf(tmp,"%s/%s",dirName,linkedFile);m_fileInfo[cnt_dirFiles].lnameColor=getFileColorByType(tmp,getFileType(m_stat.st_mode));}//-R命令时保存子目录if(maskArray[2]&&m_fileInfo[cnt_dirFiles].type==DF){strcpy_s(subDirFile[cnt_subDir],sizeof(subDirFile[cnt_subDir]),m_fileInfo[cnt_dirFiles].name);cnt_subDir++;}total_size+=m_fileInfo[cnt_dirFiles].size;cnt_dirFiles++;firCallFlag=1;}if(firCallFlag==0){return false;}//排序输出文件sortFiles(m_fileInfo,cnt_dirFiles);//输出文件int col=4,row;int max_lenRowOfCol=0;//当前列最长行长度int total_lenRow=0;//当前行总长度int len=0,firColFlag=0;int j=0;row=cnt_dirFiles/col;row=(cnt_dirFiles*1.0/col>row)?row+1:row;if(maskArray[0]==1){if(maskArray[2]){for(j=0;j<dirLevel;j++){printf("\t");}}printf("file number:%d total size:%d\n",cnt_dirFiles,total_size);}for(i=1;i<=cnt_dirFiles;i++){if(maskArray[2]&&(i<=row||maskArray[0]||maskArray[9])) {for(j=0;j<dirLevel;j++){printf("\t");}}len=outFileByMaskArray(m_fileInfo[i-1],maskArray);if(maskArray[0]==1){printf("\n");}else if(maskArray[9]==1){printf("\n");}else if(maskArray[8]==1){if(i!=cnt_dirFiles)printf(",");}else{if(i==cnt_dirFiles){if(i%row!=0){moveOutPos(-(row-(i%row)),total_lenRow+len);}}else if(i%row==0){total_lenRow+=max_lenRowOfCol;max_lenRowOfCol=0;if(row>1)moveOutPos(row-1,-total_lenRow);printf("\033[%dC",total_lenRow+3);total_lenRow+=3;firColFlag=1;}else{if(max_lenRowOfCol<len){max_lenRowOfCol=len;}if(firColFlag)//不是首列{if(row>1)moveOutPos(-1,-len);}else{printf("\n");}}}}closedir(curDir);printf("\n");//递归遍历子目录char dirPath[50]="";if(maskArray[2]){for(i=0;i<cnt_subDir;i++){if(!strcmp(subDirFile[i],".")||!strcmp(subDirFile[i],"..")){continue;}sprintf(dirPath,"%s/%s",dirName,subDirFile[i]);getDirInfo(dirPath,dirLevel+1);}}return true;}//获得帮助菜单void getHelpMenu(){FILE*fp=NULL;char ch;fopen_s(&fp,HELP_FILE,"rb");if(fp==NULL){fopen_s(&fp,TMP_FILE,"rb");if(fp==NULL){return;}}while((ch=fgetc(fp))!=EOF){fputc(ch,stdout);}fclose(fp);return;}//初始化bool init(){m_fileInfo=(fileInfo*)malloc(sizeof(fileInfo)*MAX_FILE_NUM);ALLOC_MEM_LEN+=MAX_FILE_NUM;if(m_fileInfo==NULL){return false;}return true;}//释放内存void freeMem(){free(m_fileInfo);m_fileInfo=NULL;}##MakeFile#CC=gccCFLAGS=CFILES=$(wildcard*.c)OBJS=$(CFILES:%c=%o)ls:$(OBJS)$(CC)$(CFLAGS)-o ls$(OBJS).c.o:$(CC)-c$^.PHONY:cleanclean:rm-f ls_fileHandle*.o main*.ohel p I nf o.d at l s.c l s_f i l eH and l e.c l s_f i l eH and l e.h M akef i l e。