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

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,我們下期再見!!!更多精彩內容合集可訪問項目://github.com/Chang-LeHung/CSCore

關注公眾號:一無是處的研究僧,了解更多電腦(Java、Python、電腦系統基礎、演算法與數據結構)知識。

Tags: