Linux命令系列之ls——原來最簡單的ls這麼複雜

2022-10-07 18:01:30

Linux命令系列之ls——原來最簡單的ls這麼複雜

ls命令應該是我們最常用的命令之一了,但是我們可能容易忽略那些看起來最簡單的東西。

簡介

ls命令的使用格式如下

ls [選項] [具體的檔案] # [] 表示可選
  • 直接在命令列輸入ls將當前目錄下的列出當前目錄下的檔案和目錄。
$ls
LICENSE  README.md  hello.c
  • 也可以指定具體的目錄和檔案
$ls /
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr
  • 展示隱藏檔案(所謂隱藏檔案就是以.開頭的目錄或者檔案),增加-a選項。
$ls -a
.  ..  .git  LICENSE  README.md  hello.c # . 表示當前目錄 .. 表示上一級目錄
  • 展示檔案的詳細資訊。
$ls -al
total 44
drwxr-xr-x 3 root root  4096 Oct  6 04:20 .
drwx------ 1 root root  4096 Oct  7 03:16 ..
drwxr-xr-x 8 root root  4096 Aug 26 15:28 .git
-rw-r--r-- 1 root root 18027 Aug 26 15:28 LICENSE
-rw-r--r-- 1 root root   210 Aug 26 15:28 README.md
-rw-r--r-- 1 root root    72 Aug 26 15:32 hello.c

詳細資訊說明

我們現在來仔細分析一下ls輸出結果:

第一行 total 44,表示這個目錄下面所有的檔案的大小總和,單位是KiB

然後是接下來的每一行,每一行的開頭都有10個字元,他們的含義具體如下:

檔案型別說明

第一個字元,有的是d, 有的是-,在linux系統當中,這第一個字元表示檔案的型別,他有如下幾種型別:

  • d,表示目錄,比如說上面的.當前目錄,..上一級的目錄。
  • -,表示一般的檔案,比如說上面的hello.c.
  • b,表示塊裝置,比如我們的磁碟就是一種塊裝置,他們的這個位置都是b
$ls -al /dev/ | grep sda
brw-rw----  1 root disk      8,   0 Apr 30 23:16 sda
brw-rw----  1 root disk      8,   1 Apr 30 23:16 sda1
brw-rw----  1 root disk      8,   2 Apr 30 23:16 sda2
brw-rw----  1 root disk      8,   3 Apr 30 23:16 sda3
  • l,表示一個符號連結檔案,也叫做軟連結。比如我們建立一個軟連結檔案,並且檢視它,軟連結就相當於windows中的快捷方式,它並不真正的去儲存資料,簡單說來只是儲存來一個指向一個檔案的連結。
$ln -s hello.c softlink.c
$ls -al
total 52
drwxr-xr-x 3 root root  4096 Oct  7 03:39 .
drwx------ 1 root root  4096 Oct  7 03:33 ..
drwxr-xr-x 8 root root  4096 Aug 26 15:28 .git
-rw-r--r-- 1 root root 18027 Aug 26 15:28 LICENSE
-rw-r--r-- 1 root root   210 Aug 26 15:28 README.md
-rw-r--r-- 3 root root    72 Aug 26 15:32 copy.c
-rw-r--r-- 3 root root    72 Aug 26 15:32 dcopy.c
-rw-r--r-- 3 root root    72 Aug 26 15:32 hello.c
lrwxrwxrwx 1 root root     7 Oct  7 03:39 softlink.c -> hello.c # 這裡就表示是軟連結
  • p,表示一個管道,我們在進行多程序通訊的時候可能需要使用到這個裝置檔案。比如我們建立一個具體的管道:
$mkfifo test
$ll
total 52
drwxr-xr-x 3 root root  4096 Oct  7 05:06 ./
drwx------ 1 root root  4096 Oct  7 03:40 ../
drwxr-xr-x 8 root root  4096 Aug 26 15:28 .git/
-rw-r--r-- 1 root root 18027 Aug 26 15:28 LICENSE
-rw-r--r-- 1 root root   210 Aug 26 15:28 README.md
-rw-r--r-- 3 root root    72 Aug 26 15:32 copy.c
-rw-r--r-- 3 root root    72 Aug 26 15:32 dcopy.c
-rw-r--r-- 3 root root    72 Aug 26 15:32 hello.c
lrwxrwxrwx 1 root root     7 Oct  7 03:39 softlink.c -> hello.c
prw-r--r-- 1 root root     0 Oct  7 05:06 test # 這裡就是我麼你建立的管道
  • s,這個表示一個通訊端,用於網路通訊。

許可權說明

對於後面9個字元來說,是用於表示檔案的相關許可權的。對於每一種檔案來說,它主要有三個許可權,讀、寫和執行,我們很容易理解這三種許可權,對於一個檔案來說我們當然是想要讀和寫的,對於有的檔案來說我們希望他是可執行的。我們稍後具體具一個例子,我們先來看這個9個位置分表表示的含義。

在這9個位置的字元當中如果是用-表示,則說明沒有對應的許可權,如果是用對應的r,w,x表示,則說明有對應的許可權。這9個字元每三個字元是一組,第一組表示檔案的作者的許可權,第二組表示作者所在組內的其他人的許可權,第三組表示其他人的許可權,也就是除了作者和作者所在的組之外的其他人的許可權。

比如在上圖當中有一個可執行檔案a.out,但是當我們使用chmod命令將他的所有的可執行許可權都刪掉的時候他就不可以被執行了,程式輸出的結果表示沒有許可權。在沒有修改之前,作者、組和其他人的許可權為-rwxr-xr-x,所有的這些人都有可執行的許可權。但是當執行命令chmod -x a.out之後去除了所有人的可執行許可權之後,再想執行a.out就會報錯了,表示許可權不夠,如果我們還想執行a.out的話就需要將許可權重新加回去:

上面主要談到了關於許可權的問題,我們現在來好好談一談chmod命令,這條命令主要是用來修改檔案的許可權的,比如上面那樣。在chmod當中我們可以有如下的幾種方式去修改檔案的許可權:

  • 直接通過+r+w+x-r-w-x去修改三個不同的位置的許可權,具體如下面這個例子所示。

  • 除此之外我們還可以指定特定的人或者組。

  • 在上面的例子當中我們還使用陣列去表示許可權,因為不管是那中型別的使用者都有三種許可權,每一種許可權有具有兩種狀態,有這個許可權和沒有這個許可權。那麼每一個位置都可以使用一個二進位制位進行表示,當二進位制位為1的時候就說明有這個許可權,為0的時候就沒有這個許可權。那麼三個二進位制位就表示一類使用者(作者、組和其他),因此每一個使用者的許可權我們可以用三個二進位制數進行表示,比如在上圖當中的chmod 746 hello.c這條命令的輸出結果和下圖當中是相互對應的,打擊可以仔細對照的思考一下。

其他說明

至此我們已經完成了ls輸出的第一步分析,接下來我們來看第二行,第二行輸出的資料是檔案的連結的數目。對於目錄來說這個連結的數目就是子目錄的數目,對於檔案來說就是硬連結的數量。對於一個新建立的檔案來說硬連結的數目為1,我們可以是使用ln命令去增加一個檔案的硬連結的數量,比如下圖

硬連結和軟連結的主要區別就是,軟連結不會影響連結的數量,他只是指向一個檔案,而硬連結不一樣,他會增加一個檔案連結的數量,當我們刪除一個檔案的時候事實上並不是直接將這個檔案從磁碟當中刪除,而是將這個檔案的連結數減去一,當這個連結數等於0的時候才會刪除這個檔案,而刪除一個軟連結是不會影響連結的數量的,他只是在被發現是軟連結的時候去讀它指向的那個檔案的內容。

第三列和第四列主要是使用者名稱和使用者所在的組的組名。第五列是檔案的大小,單位是Byte。後面三列是檔案上一次修改時間分別對應月、日、分秒,最後一列則是檔名。

彩蛋

  • 我們可以使用stat命令去檢視一個檔案詳細的後設資料資訊,這些資訊是儲存在檔案的inode資訊裡面的。
$stat hello.c 
  File: hello.c
  Size: 72        	Blocks: 8          IO Block: 4096   regular file
Device: 91h/145d	Inode: 1577767     Links: 3
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-10-07 05:41:32.685021010 +0000
Modify: 2022-10-07 05:41:27.547021008 +0000
Change: 2022-10-07 05:41:27.552021008 +0000
 Birth: 2022-08-26 15:32:43.726183003 +0000 

對應的資訊如下:

  • ls -R 遞迴列出子目錄當中的檔案。

  • ls -S 根據檔案大小排序

  • ls - t 根據最後一次修改時間排序。

  • ls -r 逆序排列。


以上就是本篇文章的所有內容了,我是LeHung,我們下期再見!!!更多精彩內容合集可存取專案:https://github.com/Chang-LeHung/CSCore

關注公眾號:一無是處的研究僧,瞭解更多計算機(Java、Python、計算機系統基礎、演演算法與資料結構)知識。