linux命令实现:ls

来源:互联网 发布:pdf扫描软件下载 编辑:程序博客网 时间:2024/05/21 17:00

ls命令使用详解

ls 命令可以说是linux下最常用的命令之一。


-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
-c 输出文件的 i 节点的修改时间,并以此排序。
-d 将目录象文件一样显示,而不是显示其下的文件。
-e 输出时间的全部信息,而不是输出简略信息。
-f -U 对输出的文件不排序。
-g 无用。
-i 输出文件的 i 节点的索引信息。
-k 以 k 字节的形式表示文件的大小。
-l 列出文件的详细信息。
-m 横向输出文件名,并以“,”作分格符。
-n 用数字的 UID,GID 代替名称。
-o 显示文件的除组信息外的详细信息。
-p -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通
文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套
接字(sockets)。
-q 用?代替不可输出的字符。
-r 对目录反向排序。
-s 在每个文件名后输出该文件的大小。
-t 以时间排序。
-u 以文件上次被访问的时间排序。
-x 按列输出,横向排序。
-A 显示除 “.”和“..”外的所有文件。
-B 不输出以 “~”结尾的备份文件。
-C 按列输出,纵向排序。
-G 输出文件的组的信息。
-L 列出链接文件名而不是链接到的文件。
-N 不限制文件长度。
-Q 把输出的文件名用双引号括起来。
-R 列出所有子目录下的文件。
-S 以文件大小排序。
-X 以文件的扩展名(最后一个 . 后的字符)排序。
-1 一行只输出一个文件。

--color=no 不显示彩色文件名
--help 在标准输出上显示帮助信息。
--version 在标准输出上输出版本信息并退出。

只列出子目录
1. ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)
2. ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)

计算当前目录下的文件数和目录数
下面命令可以分别计算当前目录下的文件和目录个数:
# ls -l * |grep "^-"|wc -l ---- to count files
# ls -l * |grep "^d"|wc -l ----- to count dir

显示彩色目录列表
打开/etc/bashrc, 加入如下一行:
alias ls="ls --color"
下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:
1. 蓝色-->目录
2. 绿色-->可执行文件
3. 红色-->压缩文件
4. 浅蓝色-->链接文件
5. 灰色-->其他文件

ls -tl --time-style=full-iso sshd
ls -ctl --time-style=long-iso

ls 命令的含义是list显示当前目录中的文件名字。注意不加参数它显示除隐藏文件外的所有文件及目录的名字。

       1ls –a 显示当前目录中的所有文件,包含隐藏文件

]# ls –a

.                .gnome2             .nautilus

..               .gnome2_private     oracle_rpm

.bash_profile    .gtkrc-1.2-gnome2   tnsnames.ora

.bashrc          .ICEauthority       types.h

       注意隐藏文件是在文件名字以“.”(英文句号)开头的文件。

      

       2ls –l 显示文件及其详细信息。

]# ls –l

total 5

-rw-r--r--    1 root     root         1668 Oct 3 2007 anaconda-ks.cfg

drwxr-xr-x    2 root     root         4096 Nov 6 00:04 aa

显示的文件详细信息分别代表什么呢?以上面蓝色部分为例。

total 5 代表当前目录下文件大小的总和为5K(每个目录的大小都按4K算)

drwxr-xr-x 第一个字符有3种情况:“-”表示普通文件,“d”代表目录,“l”代表连接文件,“b”代表设备文件。

后面的9个字符每3个为一组,分别代表文件所有者、文件所有者所在用户组、其它用户对文件拥有的权限。每组中3个字符分别代表读、写、执行的权限,若没有其中的任何一个权限则用“-”表示。执行的权限有两个字符可选“x”代表可执行,s”代表套接口文件

紧接着的数字2代表 aa”这个目录下的目录文件数目(这个数目=隐藏目录数目+普通目录数目)。我们进入“aa”目录用命令 ls –al (为了看到隐藏文件我们加上-a这个参数)

]# ls -al

total 8

drwxr-xr-x    2 root    root         4096 Nov 6 00:04 .

drwxr-x---   14 root     root         4096 Nov 6 00:04 ..

(上面的第3行中的2代表当前目录中有子目录2个,即...

上面的第4行中的14代表这个目录的上一层目录中有14个子目录。)

再接下来的root代表这个文件(目录)的属主为 用户root

再接下来的root代表这个文件(目录)所属的用户组为 root

4096 代表文件的大小(字节数),目录的大小总是为4096字节。

Nov 6 00:04 代表文件(目录)的修改时间。

aa代表文件(目录)在名字。

3)文件名颜色的含义

默认色代表普通文件。 例:install.log

绿色代表可执行文件。 例:rc.news

红色代表tar包文件。    例:vim-7.1.tar.bz2

       蓝色代表目录文件。    例:aa

       水红代表图象文件。    例:Sunset.jpg

       青色代表链接文件。    例:rc4.d   (此类文件相当于快捷方式)

       黄色代表设备文件。    例:fd0

      

4)几个比较常用的参数。

       -t 按最后修改时间排序。

       -S 按文件大小排序。(大写的S

       -r 排序时按倒序。

       -h 显示文件大小时增加可读性 (例:1K 234M 2G

如果这个aa是个普通文件,2就代表这个文件有2个别名(这个文件被人创建了一个硬链接文件)

 


----------------------------------------------------------------------------------------------------------------

以上出自:http://blog.chinaunix.net/u2/63316/showart_1287133.html

----------------------------------------------------------------------------------------------------------------




linux下改变输出在终端的字体颜色

简单的说就是ESC[*m,ESC的八进制为\033,*可以是多个属性的组合,用分号隔开。


例:
#include
int main()
{
    printf("\033[31mThis is RED.\n\033[0m");
    return 0;
}
31m代表字体为红色,0m代表关闭所有属性。


常用的ANSI控制码如下(有些不支持):
\033[0m 关闭所有属性 
\033[1m 高亮
\033[2m 亮度减半
\033[3m 斜体
\033[4m 下划线 
\033[5m 闪烁 
\033[6m 快闪
\033[7m 反显 
\033[8m 消隐 
\033[9m 中间一道横线
10-19 关于字体的
21-29 基本与1-9正好相反
30-37 设置前景色
40-47 设置背景色
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
38 打开下划线,设置默认前景色 
39 关闭下划线,设置默认前景色 
40 黑色背景 
41 红色背景 
42 绿色背景 
43 棕色背景 
44 蓝色背景 
45 品红背景 
46 孔雀蓝背景 
47 白色背景 
48 不知道什么东西
49 设置默认背景色
50-89 没用
90-109 又是设置前景背景的,比之前的颜色浅
\033[nA 光标上移n行 
\033[nB 光标下移n行 
\033[nC 光标右移n行 
\033[nD 光标左移n行 
\033[y;xH设置光标位置 
\033[2J 清屏 
\033[K 清除从光标到行尾的内容 
\033[s 保存光标位置 
\033[u 恢复光标位置 
\033[?25l 隐藏光标 
\033[?25h 显示光标
------------------------------------------------------------------------------------------------------------------

以上出自:http://blog.sina.com.cn/s/blog_628ba3e00101jll1.html

----------------------------------------------------------------------------------------------------------------------------------------------------------------------



实现了ls的基本功能,以及-[al]两个参数

ls [-al] filename1 filename2 ...

输出的排版相对于ls命令来说,有点差别,研究了一下排版,发现实现需要一点时间,而那又不是关键问题,所以没搞。

还有特殊文件显色,这个功能,后来我才决定要加,结果代码框架已经成型。如果要加的话,要么把数据类型给改掉,要么就会多上许多冗余代码,其实要加也不困难,索性就贴到这里了。


另外在写这个代码的过程中,一些小小bug引发了我的思考,收获颇丰:

char *str1 = "who",*str2[30]="who";

sizeof(str1),sizeof(str2),strlen(str1),strlen(str2); 值应该是4 30 3 3 

其中sizeof()是得到一个数据类型所占的字节数,是数据类型的字节数!

就比如sizeof(某个指针ptr) ,它得到的是ptr这个东西的字节数,而不是它指向的东西的字节数。


重新思考查阅了数组和指针的区别

int a[5] = {1,2,3,4,5};

int *p = (int *)(&a+1);

问:*(p-1)与*(a+1)


思考了一下多维指针。



----------------------------------------------------

附上代码:


#include<stdio.h>#include<time.h>#include<stdlib.h>#include<malloc.h>#include<unistd.h>#include<string.h>#include<sys/ioctl.h>#include<sys/stat.h>#include<sys/types.h>#include<grp.h>#include<dirent.h>#include<pwd.h>#include<termios.h>static int flag_l,flag_a;static int len_file,len_dir,len_all,len_max,len_screen;char PREPATH[256];void ls_dir(char*);char **ls_file(char **,int );int f_exist(char *);void deal(char **,char ***,char ***);char *change_mode(int);int get_col();void sort(char **,int);char **flag(int ,char **);int main(int ac,char **av){char **avv = flag(ac,av),**avfile=NULL,**avdir=NULL;if(avv == NULL){len_screen = get_col();ls_dir(".");return ;}deal(avv,&avfile,&avdir);ls_file(avfile,len_file);if(len_dir)while(*avdir){printf("%s:\n",*avdir);ls_dir(*avdir++);}}void ls_dir(char *dirpath){DIR *ptr;struct dirent *direntp;char **p;int i = 0,j,count = 0;if((ptr = opendir(dirpath)) == NULL){perror(dirpath);exit(-1);}while(readdir(ptr) != NULL)count++;seekdir(ptr,0);p = (char **)malloc(sizeof(char*)*count);while((direntp = readdir(ptr)) != NULL){if(!flag_a) {if((direntp->d_name)[0] == '.') continue;}p[i] = (char *)malloc(strlen(direntp->d_name)*sizeof(char));strcpy(p[i],direntp->d_name);i++;}for(j=0;j<i;j++)sort(p,i);for(j=0;j<i;j++)strcpy(PREPATH,dirpath);j = strlen(PREPATH);if(PREPATH[j -1] != '/'){PREPATH[j++] = '/';PREPATH[j] = 0;}ls_file(p,i);}char **ls_file(char **p,int n)//*p== file_name a lot of *p ->**p;{if(n == 0) return NULL;if(flag_l){int i,j,k;struct stat st;struct passwd *pw;struct group *gp;char *str,*fname = NULL,PATH[256];for(i=0,j=0;i<n;i++){if(strlen(PREPATH) != 0){strcpy(PATH,PREPATH);strcat(PATH,p[i]);}else{strcpy(PATH,p[i]);}if(stat(PATH,&st) == -1){perror(PATH);exit(-1);}str = change_mode(st.st_mode);pw = getpwuid(geteuid());gp = getgrgid(getegid());fname = p[i];while(PATH[j])if(PATH[j++] == '/') fname = &PATH[j];printf("%s %3d %7s %7s %-6d %.12s %-10s\n",str,st.st_nlink,pw->pw_name,gp->gr_name,st.st_size,ctime(&st.st_mtime)+4,fname);free(str);//free(pw); can not free//free(gp);}printf("\n");return p;}int i,j,k,col,row,count;//NO.col for one linefor(i=0;i<n;i++)len_max=(len_max>strlen(p[i])?len_max:strlen(p[i]));col = len_screen / len_max;for(i=0;i<n;){for(j=0;j<col&&i<n;j++,i++){printf("%s",p[i]);for(k=strlen(p[i]);k<=len_max+1;k++)printf(" ");}printf("\n");}printf("\n");return p;}int f_exist(char *path){struct stat st;int re;re = stat(path,&st);if(re == -1){perror(path);exit(-1);}if(S_ISDIR(st.st_mode)){return 1;}return 0;}void deal(char **avv,char *** avfile,char *** avdir){int i,j;for(i=0;i<len_all;i++){if(f_exist(avv[i])){if(!len_dir) *avdir=(char **)malloc(sizeof(char *)*len_all);(*avdir)[len_dir] = (char *)malloc(sizeof(char)*strlen(avv[i]));strcpy((*avdir)[len_dir],avv[i]);len_dir++;}else {if(!len_file) *avfile=(char **)malloc(sizeof(char *)*len_all);(*avfile)[len_file] = (char *)malloc(sizeof(char)*strlen(avv[i]));strcpy((*avfile)[len_file],avv[i]);len_file++;}}sort(*avdir,len_dir);sort(*avfile,len_file);len_screen = get_col();}char* change_mode(int mode){char *str = (char *)malloc(sizeof(char)*12);strcpy(str,"----------");if(S_ISDIR(mode)) str[0] = 'd';if(S_ISCHR(mode)) str[0] = 'c';if(S_ISBLK(mode)) str[0] = 'b';if(S_ISLNK(mode)) str[0] = 'l';if(mode&00400) str[1] = 'r';if(mode&00200) str[2] = 'w';if(mode&00100) if(mode&04000) str[3] = 's';else           str[3] = 'x';if(mode&00040)   str[4] = 'r';if(mode&00020)  str[5] = 'w';if(mode&00010) if(mode&02000) str[6] = 's';else  str[6] = 'x';if(mode&00004)  str[7] = 'r';if(mode&00002)  str[8] = 'w';if(mode&00001) if(mode&01000) str[9] = 's';else  str[9] = 'x';return str;}int get_col(){struct winsize size;ioctl(STDIN_FILENO,TIOCGWINSZ,&size);return size.ws_col;}char **flag(int ac,char **a){char **fiv=NULL;int i,j,k=0,mak=1;for(i=1;i<ac;i++){if(a[i][0] == '-'){for(j=1;a[i][j] != '\0';j++){if(a[i][j] == 'a') flag_a=1;else if(a[i][j] == 'l') flag_l=1;}}else {if(mak) {fiv = (char **)malloc((ac-1)*sizeof(char *));mak = 0;}fiv[k] = (char *)malloc(strlen(a[i])*sizeof(char));strcpy(fiv[k],a[i]);k++;}}len_all = k;return fiv;}void sort(char **a,int n){if(n == 1||n == 0) return ;int i = 0,j = n-1;char *key = a[i];while(j>i){while(j>i){if(strcmp(key,a[j]) > 0) {a[i] = a[j];i++;break;}j--;}while(j>i){if(strcmp(a[i],key) > 0) {a[j] = a[i];j--;break;}i++;}}a[i] = key;sort(a,i);sort(a+i+1,n-i-1);return ;}


0 0
原创粉丝点击