Linux 命令行完全指南:ls 命令用法詳解
ls命令可以理解為英文單詞list的縮寫,其功能是列出目錄的內(nèi)容及其內(nèi)容屬性信息(list directory contents )。該命令有點類似于DOS系統(tǒng)下的dir命令,主要作用是顯示目錄下的內(nèi)容,命令格式如下:
[root@localhost ~]# ls [選項] [文件名或目錄名]
#命令后面的選項和目錄文件可以省略,表示查看當前路徑的文件信息
選項 | 功能 |
-a | 顯示目錄下的所有文件,包括以 "." 開頭的隱藏文件; |
-d,--directory | 當遇到目錄時,列出目錄本身而非目錄內(nèi)的文件,并且不跟隨符鏈接; |
-h | 以人類可讀的信息顯示文件或目錄大小,如1KB、234MB、2GB等 |
-q | 將文件名中的非打印字符輸出為問號。(對于到終端的輸出這是缺省的。) |
-t | 根據(jù)最后的修改時間(mtime)排序,默認是以文件名排序; |
-u | 使用最近訪問時間代替最近修改時間為依據(jù)來排序(使用“-t”選項時)或列出(使用“-l”選項時)。 |
-1,--format=single-column | 阿拉伯數(shù)字1,一行輸出一個文件(單列輸出)。如標準輸出不是到終端,此選項就是缺省選項。 |
-b,--escape | 把文件名中不可輸出的字符用反斜杠加字符編號(就象在 C 語言里一樣)的形式列出。以八進制溢出序列表示不可打印的字符; |
-c,--time=ctime,--time=status | 按文件狀態(tài)改變時間(i節(jié)點中的ctime)排序并輸出目錄內(nèi)容。如采用長格式輸出(選項 |
-t,--sort=time | 按文件最近修改時間(i節(jié)點中的mtime)而不是按文件名字典序排序,新文件靠前。 |
-u,--time=atime,--time=access,--time=use | 類似選項 |
-f | 不排序目錄內(nèi)容;按它們在磁盤上存儲的順序列出。同時啟動“-aU”選項,如果在“-f”之前存在“-l”、“--color”、“-t”或“-s”,則禁止這些選項。 |
-g | 忽略,為兼容UNIX用。 |
-i,--inode | 在每個文件左邊打印i節(jié)點號(也叫文件序列號和索引號),i節(jié)點號在每個特定的文件系統(tǒng)中是唯一的; |
-k,--kilobytes | 如列出文件大小,則以千字節(jié)KB為單位。 |
-l,--format=long,--format=verbose | 除每個文件名外,增加顯示文件類型、權(quán)限、硬鏈接數(shù)、所有者名、組名、大小(byte)、及時間信息(如未指明是其它時間即指修改時間)。對于6個月以上的文件或超出未來1小時的文件,時間信息中的時分將被年代取代。每個目錄列出前,有一行“總塊數(shù)”顯示目錄下全部文件所占的磁盤空間。塊默認是1024字節(jié);如果設(shè)置了POSIXLY_CORRECT的環(huán)境變量,除非用“-k”選項,則默認塊大小是512字節(jié)。每一個硬鏈接都計入總塊數(shù)(因此可能重復計數(shù)),這無疑是個缺點。列出的權(quán)限類似于以符號表示(文件)模式的規(guī)范。但是ls在每套權(quán)限的第三個字符中結(jié)合了多位(multiplebits)的信息,如下: s如果設(shè)置了setuid位或setgid位,而且也設(shè)置了相應(yīng)的可執(zhí)行位。S如果設(shè)置了setuid位或setgid位,但是沒有設(shè)置相應(yīng)的可執(zhí)行位。t如果設(shè)置了sticky位,而且也設(shè)置了相應(yīng)的可執(zhí)行位。T如果設(shè)置了sticky位,但是沒有設(shè)置相應(yīng)的可執(zhí)行位。x如果僅僅設(shè)置了可執(zhí)行位而非以上四種情況。-其它情況(即可執(zhí)行位未設(shè)置)。 |
-m,--format=commas | 水平列出文件,每行盡可能多,相互用逗號和一個空格分隔。 |
-n,--numeric-uid-gid | 列出數(shù)字化的UID和GID而不是用戶名和組名。 |
-o | 以長格式列出目錄內(nèi)容,但是不顯示組信息。等于使用“--format=long--no-group”選項。提供此選項是為了與其它版本的ls兼容。 |
-p | 在條目后加上一個字符以說明該文件的類型。類似 |
-q,--hide-control-chars | 用問號代替文件名中非打印的字符。這是缺省選項。 |
-r,--reverse | 依相反次序排序; |
-s,--size | 在每個文件名左側(cè)輸出該文件的大小,以1024字節(jié)的塊為單位。如果設(shè)置了POSIXLY_CORRECT的環(huán)境變量,除非用“-k”選項,塊大小是512字節(jié)。 |
-w,--widthcols | 假定屏幕寬度是cols(cols以實際數(shù)字取代)列。如未用此選項,缺省值是這樣獲得的: 如可能先嘗試取自終端驅(qū)動,否則嘗試取自環(huán)境變量COLUMNS(如果設(shè)置了的話),都不行則取80。 |
-x,--format=across,--format=horizontal | 多列輸出,橫向排序(相當于將 |
-A,--almost-all | 顯示除"."和".."外的所有文件; |
-B,--ignore-backups | 不輸出以“~”結(jié)尾的備份文件,除非已經(jīng)在命令行中給出。 |
-C,--format=vertical | 多列輸出,縱向排序。當標準輸出是終端時這是缺省項。使用命令名dir和d時,則總是缺省的。 |
-D,--dired | 當采用長格式(“-l”選項)輸出時,在主要輸出后,額外打印一行: //DIRED//BEG1END1BEG2END2...BEGn和ENDn是無符號整數(shù),記錄每個文件名的起始、結(jié)束位置在輸出中的位置(字節(jié)偏移量)。這使得Emacs易于找到文件名,即使文件名包含空格或換行等非正常字符也無需特異的搜索。如果目錄是遞歸列出的(“-R”選項),每個子目錄后列出類似一行: //SUBDIRED//BEG1END1...【譯注: 我測試了TurboLinux3.0和RedHat6.1,發(fā)現(xiàn)它們都是在“//DIRED//BEG1...”之后列出“//SUBDIRED//BEG1...”,也即只有一個而不是在每個子目錄后都有。而且“//SUBDIRED//BEG1...”列出的是各個子目錄名的偏移?!?/span> |
-F,--classify,--file-type | 在每個文件名后附上一個字符以說明該文件的類型; |
-G,--no-group | 以長格式列目錄時不顯示組信息。 |
-I,--ignorepattern | 除非在命令行中給定,不要列出匹配shell文件名匹配式(pattern,不是指一般表達式)的文件。在shell中,文件名以"."起始的不與在文件名匹配式(pattern)開頭的通配符匹配。 |
-L,--dereference | 列出符號鏈接指向的文件的信息,而不是符號鏈接本身。 |
-N,--literal | 不要用引號引起文件名。 |
-Q,--quote-name | 用雙引號引起文件名,非打印字符以C語言的方法表示。 |
-R,--recursive | 遞歸列出所有子目錄; |
-S,--sort=size | 按文件大小而不是字典序排序目錄內(nèi)容,大文件靠前; |
-T,--tabsizecols | 假定每個制表符寬度是cols。缺省為8。為求效率,ls可能在輸出中使用制表符。若cols為0,則不使用制表符。 |
-U,--sort=none | 不排序目錄內(nèi)容;按它們在磁盤上存儲的順序列出。(選項“-U”和“-f”的不同是前者不啟動或禁止相關(guān)的選項。)這在列很大的目錄時特別有用,因為不加排序能顯著的加快速度。 |
-X,--sort=extension | 按文件擴展名(由最后的"."之后的字符組成)的字典序排序,沒有擴展名的先列出; |
--color[=when] | 指定是否使用顏色區(qū)別文件類別。環(huán)境變量 |
--full-time | 列出完整的時間,而不是使用標準的縮寫。格式如同date(1)的缺省格式;此格式是不能改變的,但是你可以用cut(1)取出其中的日期字串并將結(jié)果送至命令“date-d”。輸出的時間包括秒是非常有用的。(Unix文件系統(tǒng)儲存文件的時間信息精確到秒,因此這個選項已經(jīng)給出了系統(tǒng)所知的全部信息。)例如,當你有一個Makefile文件不能恰當?shù)纳晌募r,這個選項會提供幫助。 |
--time-style={full-iso,long-iso,iso,locale} | 以不同的時間格式輸出,long-iso效果最好; |
--time={atime,ctime} | 按不同的時間屬性輸出,atime表示按訪問時間,ctime表示按改變權(quán)限屬性時間,如果不加此參數(shù)則默認為最后修改時間; |
案例演示:
在開始范例講解之前,需要先做一些準備,順便整合一下前面使用的命令:
[root@localhost ~]# mkdir /test
[root@localhost ~]# cd /test/
[root@localhost test]# touch file{1..3}.txt
[root@localhost test]# mkdir dir{1..3}(1) 直接執(zhí)行l(wèi)s命令,不帶任何參數(shù);
[root@localhost test]# ls
#不加選項的結(jié)果,顯示所有文件和目錄
dir1 dir2 dir3 file1.txt file2.txt file3.txt(2) 使用-a參數(shù)顯示所有文件,特別是隱藏文件;
[root@localhost test]# touch .file.txt
#再創(chuàng)建一個隱藏文件,再Linux系統(tǒng)中以.開頭的文件就是隱藏文件
[root@localhost test]# ls
dir1 dir2 dir3 file1.txt file2.txt file3.txt
[root@localhost test]# ls -a
. .. dir1 dir2 dir3 file1.txt file2.txt file3.txt .file.txt
#加了-a選項,就會把以.開頭的內(nèi)容顯示出來了。這里顯示的第一個點號,表示當前目錄,即test目錄本身;而兩個點號則表示當前目錄的上級目錄,此處就代表根目錄了;
[root@localhost test]# ls -A
dir1 dir2 dir3 file1.txt file2.txt file3.txt .file.txt
#列出所有文件,包括隱藏文件,但不包括.和..這兩個目錄(3) 使用-l參數(shù)顯示詳細信息;
[root@localhost test]# ls -l
#此處的時間屬性列默認顯示的是文件的最后一次修改時間
total 0
drwxr-xr-x. 2 root root 6 Jan 21 15:39 dir1
drwxr-xr-x. 2 root root 6 Jan 21 15:39 dir2
drwxr-xr-x. 2 root root 6 Jan 21 15:39 dir3
-rw-r--r--. 1 root root 0 Jan 21 15:38 file1.txt
-rw-r--r--. 1 root root 0 Jan 21 15:38 file2.txt
-rw-r--r--. 1 root root 0 Jan 21 15:38 file3.txt
#文件類型 權(quán)限 引用計數(shù) 所有者 所屬組 大小 文件修改時間 文件名我們已經(jīng)知道-l選項用于顯示文件的詳細信息,那么-l選項顯示的這 7 列分別是什么含義?
- 第一列: 文件類型和權(quán)限;
- 第二列: 引用計數(shù);文件的引用計數(shù)代表該文件的硬鏈接個數(shù),而目錄的引用計數(shù)代表該目錄有多少個一級子目錄;
- 第三列: 所有者,也就是這個文件屬于哪個用戶;默認所有者是文件的建立用戶;
- 第四列: 所屬組;默認所屬組是文件建立用戶的有效組,一般情況下就是建立用戶的所在組;
- 第五列: 大?。荒J單位是字節(jié)。
- 第六列: 文件修改時間;這里的時間是文件最后被更新(包括文件創(chuàng)建、內(nèi)容更新、文件名更新等)的時間,可用如下命令查看文件的修改、訪問及變化的時間;ls -l、ls -l --time=atime、 ls -l --time=ctime,注意: 這里只是顯示不同的文件屬性時間,并不是按照屬性時間排序;
- 第七列: 文件名;
可能有人已經(jīng)注意到了,創(chuàng)建或修改時間的格式?jīng)]有年份的信息,那么如何顯示時間的全部信息呢?請看范例4。
(4) 可能有人已經(jīng)注意到了,創(chuàng)建或修改時間的格式?jīng)]有年份的信息,那么如何顯示時間的全部信息呢?
[root@localhost test]# ls -l --time-style=long-iso
total 0
drwxr-xr-x. 2 root root 6 2022-01-21 15:39 dir1
drwxr-xr-x. 2 root root 6 2022-01-21 15:39 dir2
drwxr-xr-x. 2 root root 6 2022-01-21 15:39 dir3
-rw-r--r--. 1 root root 0 2022-01-21 15:38 file1.txt
-rw-r--r--. 1 root root 0 2022-01-21 15:38 file2.txt
-rw-r--r--. 1 root root 0 2022-01-21 15:38 file3.txt對于上面的命令,說明如下:
- --time-style可選的參數(shù)值有如下幾個,如full-iso、long-iso、iso、locale,默認值是locale。
- 在生產(chǎn)場景中經(jīng)常會遇到同一目錄下的文件及目錄時間的顯示不一致的問題,所以需要用ls -l --time-style=long-iso來調(diào)整。
- 值得一提的是,執(zhí)行l(wèi)s -l等命令時,默認顯示的是文件最后一次的修改時間(如果是新文件那么就是創(chuàng)建時間了)。
- ls --full-time用于顯示完整的時間,等同于ls -l --time-style=full-iso。對應(yīng)ls命令,查看時間戳的選項如下:
- mtime:最后修改時間(ls -lt): 修改文件內(nèi)容,文件的修改時間(modify time)會改變。
- ctime:狀態(tài)改變時間(ls -lc): 修改文件內(nèi)容、移動文件或改變文件屬性 等,文件的change時間會改變。
- atime:最后訪問時間(ls -lu): 查看文件內(nèi)容時,文件的訪問時間(access time)會改變。
既然ls -l輸出結(jié)果的時間屬性列為修改時間,那么能否改成其他的時間呢?例如:顯示最后一次文件訪問時間。這當然也是可以的。
(5) 執(zhí)行l(wèi)s命令,帶顯示內(nèi)容的訪問時間屬性的參數(shù);
[root@localhost test]# ls -l --time=atime
# 輸出結(jié)果的時間屬性列將顯示文件最后一次訪問時間與之相關(guān)命令還有l(wèi)s -l --time-style=long-iso --time=ctime,用于顯示文件改變的時間。
(6) 執(zhí)行l(wèi)s命令,帶-F參數(shù)(這一點與tree命令的-F很類似)。
[root@localhost test]# ls -F
dir1/ dir2/ dir3/ file1.txt file2.txt file3.txt
#加了-F,可以清晰的看到所有目錄的結(jié)尾都被加上了斜線。當我們要過濾出所有的目錄時,那么只需要把帶斜線的過濾出來就OK了
[root@localhost test]# ls -F | grep /
dir1/
dir2/
dir3/
[root@localhost test]# ls -F | grep -v /
#過濾非目錄文件
file1.txt
file2.txt
file3.txtls -F命令表示在每個文件名后附上一個字符以說明文件的類型:
- *表示可執(zhí)行的普通文件;
- /表示目錄;
- =表示套接字(sockets);
- |表示FIFOs;
- @表示符號鏈接;
(7) 使用-d參數(shù)只顯示目錄本身的信息。
[root@localhost test]# ls -l dir1/
total 0
#這樣根本無法查看dir1目錄本身的信息,除非到上級目錄下查看如果只是想顯示目錄本身的信息,那么這個時候-d就派上用場了。
[root@localhost test]# ls -ld dir1/
drwxr-xr-x. 2 root root 6 Jan 21 15:39 dir1/(8) 使用-R參數(shù)遞歸查看目錄。
[root@localhost test]# mkdir -p dir1/sub1/test
#遞歸創(chuàng)建目錄的命令
[root@localhost test]# ls -R dir1
#類似但是沒有tree好用的方法
dir1:
sub1
dir1/sub1:
test
dir1/sub1/test:技巧性范例
(1) 查找最近更新過的文件。
在工作中,我們經(jīng)常需要查看一個有很多文件的目錄,找出最近更新過但不知道具體文件名的文件,這時就可以用ls -lrt或ls -rt這個組合命令。
[root@localhost test]# touch /etc/test.txt
#創(chuàng)建一個新文件,假設(shè)不知道名字,你如何快速找到它?
[root@localhost test]# ls -lrt /etc
#-t是按時間排序,-r是倒敘,即按時間倒敘排序
....
-rw-r--r--. 1 root root 0 Jan 21 16:07 test.txt
#最后一屏的最后一行就是我們需要查找的文件
[root@localhost test]# ls -lrt /etc | tail -1
#如果需要直接定位文件還可以使用此命令
-rw-r--r--. 1 root root 0 Jan 21 16:07 test.txt(2) 生產(chǎn)場景數(shù)據(jù)庫備份,獲取數(shù)據(jù)庫名列表。
[root@mysql ~]# ls -F /var/lib/mysql/ | egrep "/" | awk -F "/" '{print $1}'
#innodb_temp
jumpserver
mysql
performance_schema
sys(3) 使用-F選項查看文件的類型
[root@localhost ~]# ll -Fd test
drwxr-xr-x. 2 root root 4096 Jul 14 23:40 test/其實還有個類似的選項-p,它的功能比較簡單,只是在目錄后面加上/。

























