linux命令實現:ls

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 line
	for(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 ;
}










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章