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顯示當前目錄中的文件名字。注意不加參數它顯示除隱藏文件外的所有文件及目錄的名字。
1)ls –a 顯示當前目錄中的所有文件,包含隱藏文件
]# ls –a
. .gnome2 .nautilus
.. .gnome2_private oracle_rpm
.bash_profile .gtkrc-1.2-gnome2 tnsnames.ora
.bashrc .ICEauthority types.h
注意隱藏文件是在文件名字以“.”(英文句號)開頭的文件。
2)ls –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,*可以是多個屬性的組合,用分號隔開。
以上出自: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 ;
}