1. 程式人生 > 實用技巧 >第四章 Linux常用基礎命令

第四章 Linux常用基礎命令

一、Linux cd命令:切換目錄

cd 命令,是 Change Directory 的縮寫,用來切換工作目錄。

Linux 命令按照來源方式,可分為兩種,分別是 Shell 內建命令和外部命令。所謂 Shell 內建命令,就是 Shell 自帶的命令,這些命令是沒有執行檔案的;而外部命令就是由程式設計師單獨開發的,所以會有命令的執行檔案。Linux 中的絕大多數命令是外部命令,而 cd 命令是一個典型的 Shell 內建命令,所以 cd 命令沒有執行檔案所在路徑。

cd 命令的基本格式如下:

[root@localhost ~]# cd [相對路徑或絕對路徑]


除此之外,cd 命令後面可以跟一些特殊符號,表達固定的含義,如表 1 所示:


表 1 cd 命令的特殊符號
特殊符號作 用
~ 代表當前登入使用者的主目錄
~使用者名稱 表示切換至指定使用者的主目錄
- 代表上次所在目錄
. 代表當前目錄
.. 代表上級目錄


它們的用法分別是:

  1. [root@localhost vbird]# cd ~
    #表示回到自己的主目錄,對於 root 使用者,其主目錄為 /root
    [root@localhost~]# cd
    #沒有加上任何路徑,也代表回到當前登入使用者的主目錄
    [root@localhost~]# cd ~vbird
    #代表切換到 vbird 這個使用者的主目錄,亦即 /home/vbird

  2. [root@localhost~]# cd ..

    #表示切換到目前的上一級目錄,亦即是 /root 的上一級目錄的意思;

    需要注意的是,在 Linux 系統中,根目錄確實存在 .(當前目錄)以及 ..(當前目錄的父目錄)兩個目錄,但由於根目錄是最頂級目錄,因此根目錄的 .. 和 . 的屬性和許可權完全一致,也就是說,根目錄的父目錄是自身。
  3. [root@localhost/]# cd -
    #表示回到剛剛的那個目錄


如果你仔細觀察的話,不難發現,其實在 [root@localhost~] 中,就已經指明瞭當前所在的目錄,通常剛登陸時會位於自己的主目錄中,而 ~ 就表示主目錄,因此也就有了通過使用cd ~可以回到自己的主目錄。

【例 1】學習 cd - 的用法。

[root@localhost ~]# cd /usr/local/src
#進入/usr/local/src目錄
[root@localhost src]# cd -
/root
[root@localhost ~]#
#"cd -"命令回到進入 src 目錄之前的主目錄
[root@localhost ~]# cd -
/usr/local/src
[root@localhost src]#
#再執行一遍"cd -"命令,又回到了 /usr/local/src 目錄

【例 2】學習 cd . 和 cd .. 的用法。

[root@localhost ~]# cd /usr/local/src
#進入測試目錄
[root@localhost src]# cd ..
#進入上級目錄
[root@localhost local]# pwd
/usr/local
#pwd是査看當前所在目錄的命令,可以看到我們進入了上級目錄 /usr/local
[root@localhost local]# cd .
#進入當前目錄
[root@localhost local]# pwd
/usr/local
#這個命令不會有目錄的改變,只是告訴大家"."代表當前目錄

二、Linux pwd命令:顯示當前路徑

由於 Linux 檔案系統中有許多目錄,當用戶執行一條 Linux 命令又沒有指定該命令或引數所在的目錄時,Linux 系統就會首先在當前目錄(目前的工作目錄)搜尋這個命令或它的引數。因此,使用者在執行命令之前,常常需要確定目前所在的工作目錄,即當前目錄。

當用戶登陸 Linux 系統之後,其當前目錄就是它的主目錄。那麼,如何確定當前目錄呢?可以使用 Linux 系統的pwd 命令來顯示當前目錄的絕對路徑。

pwd 命令,是 Print Working Directory (列印工作目錄)的縮寫,功能是顯示使用者當前所處的工作目錄。該命令的基本格式為:

[root@localhost ~]# pwd


【例 1】

[root@localhost ~]# whoami
root
[root@localhost ~]# pwd
/root

whoami 命令用於確定當前登陸的使用者,後續會做詳細介紹。可以看到,root 使用者當前所在目錄是它的主目錄 /root。

【例 2】

[demo@localhost ~]# whoami
demo
[demo@localhost ~]# pwd
/home/demo

以上程式碼表明,當前登陸 Linux 系統的是使用者 demo,當前所在目錄為 demo 的主目錄 /home/demo。

注意,在[demo@localhost ~]#這一部分中,雖然也顯示出當前所在的目錄(例如 ~ 表示主目錄),但此位置只會列出整個路徑中最後的那一個目錄,比如:

[root@localhost ~]# cd /var/mail
[root@localhost mail]# pwd
/var/mail

我們知道,不同的目錄中,目錄名是可以重複的,因此,僅通過[root@localhost mail]中的 mail,根本無法判斷其所在的具體位置,而使用 pwd 命令,可以輸出當前所在目錄的完整路徑。

三、Linux ls命令:檢視目錄下檔案

ls 命令,list 的縮寫,是最常見的目錄操作命令,其主要功能是顯示當前目錄下的內容。此命令的基本格式為:

[root@localhost ~]# ls [選項] 目錄名稱

表 1 列出了 ls 命令常用的選項以及各自的功能。

表 1 ls 命令常用選項及功能
選項功能
-a 顯示全部的檔案,包括隱藏檔案(開頭為 . 的檔案)也一起羅列出來,這是最常用的選項之一。
-A 顯示全部的檔案,連同隱藏檔案,但不包括 . 與 .. 這兩個目錄。
-d 僅列出目錄本身,而不是列出目錄內的檔案資料。
-f ls 預設會以檔名排序,使用 -f 選項會直接列出結果,而不進行排序。
-F 在檔案或目錄名後加上檔案型別的指示符號,例如,* 代表可執行檔案,/ 代表目錄,= 代表socket檔案,| 代表 FIFO 檔案。
-h 以人們易讀的方式顯示檔案或目錄大小,如 1KB、234MB、2GB 等。
-i 顯示 inode 節點資訊。
-l 使用長格式列出檔案和目錄資訊。
-n 以 UID 和 GID 分別代替檔案使用者名稱和群組名顯示出來。
-r 將排序結果反向輸出,比如,若原本檔名由小到大,反向則為由大到小。
-R 連同子目錄內容一起列出來,等於將該目錄下的所有檔案都顯示出來。
-S 以檔案容量大小排序,而不是以檔名排序。
-t 以時間排序,而不是以檔名排序。
--color=never
--color=always
--color=auto
never 表示不依據檔案特性給予顏色顯示。
always 表示顯示顏色,ls 預設採用這種方式。
auto 表示讓系統自行依據配置來判斷是否給予顏色。
--full-time 以完整時間模式 (包含年、月、日、時、分)輸出
--time={atime,ctime} 輸出 access 時間或改變許可權屬性時間(ctime),而不是內容變更時間。


注意,當 ls 命令不使用任何選項時,預設只會顯示非隱藏檔案的名稱,並以檔名進行排序,同時會根據檔案的具體型別給檔名配色(藍色顯示目錄,白色顯示一般檔案)。除此之外,如果想使用 ls 命令顯示更多內容,就需要使用表 1 相應的選項。

【例 1】

[root@www ~]# ls -al ~
total 156
drwxr-x---  4 root root  4096 Sep 24 00:07 .
drwxr-xr-x 23 root root  4096 Sep 22 12:09 ..
-rw-------  1 root root  1474 Sep  4 18:27 anaconda-ks.cfg
-rw-------  1 root root   955 Sep 24 00:08 .bash_history
-rw-r--r--  1 root root    24 Jan  6  2007 .bash_logout
-rw-r--r--  1 root root   191 Jan  6  2007 .bash_profile
-rw-r--r--  1 root root   176 Jan  6  2007 .bashrc
drwx------  3 root root  4096 Sep  5 10:37 .gconf
-rw-r--r--  1 root root 42304 Sep  4 18:26 install.log
-rw-r--r--  1 root root  5661 Sep  4 18:25 install.log.syslog

通過使用 -a,你會看到以 . 為開頭的幾個檔案,以及目錄檔案 (.)、(..)、.gconf 等等,這些都是隱藏的目錄和檔案。其中,目錄檔名以藍色顯示,一般檔案以白色顯示。

注意,Linux 系統中,隱藏檔案不是為了把檔案藏起來不讓其他使用者找到,而是為了告訴使用者這些檔案都是重要的系統檔案,如非必要,不要亂動!所以,不論是 Linux 還是 Windows 都可以非常簡單地査看隱藏檔案,只是在 Windows 中絕大多數的病毒和木馬都會把自己變成隱藏檔案,給使用者帶來了錯覺,以為隱藏檔案是為了不讓使用者發現。

不僅如此,這裡的 ls 命令還使用了 -l 選項,因此才顯示出了檔案的詳細資訊,此選項顯示的這 7 列的含義分別是:

  1. 第一列:規定了不同的使用者對檔案所擁有的許可權,具體許可權的含義將在後續章節中講解。
  2. 第二列:引用計數,檔案的引用計數代表該檔案的硬連結個數,而目錄的引用計數代表該目錄有多少個一級子目錄。
  3. 第三列:所有者,也就是這個檔案屬於哪個使用者。預設所有者是檔案的建立使用者。
  4. 第四列:所屬組,預設所屬組是檔案建立使用者的有效組,一般情況下就是建立使用者的所在組。
  5. 第五列:大小,預設單位是位元組。
  6. 第六列:檔案修改時間,檔案狀態修改時間或檔案資料修改時間都會更改這個時間,注意這個時間不是檔案的建立時間。
  7. 第七列:檔名或目錄名。


【例 2】
如果我們想檢視某個目錄的詳細資訊,例如:

[root@localhost ~]# ls -l /root/
總用量44
-rw-------.1 root root 1207 1 月 14 18:18 anaconda-ks.cfg
-rw-r-r--.1 root root 24772 1 月 14 18:17 install.log
-rw-r-r--.1 root root 7690 1 月 14 18:17 install.log.syslog

這個命令會顯示目錄下的內容,而不會顯示這個目錄本身的詳細資訊。如果想顯示目錄本身的資訊,就必須加入 "-d" 選項。

[root@localhost ~]# ls -ld /root/
dr-xr-x---.2 root root 4096 1 月 20 12:30 /root/


【例 3】
"ls-l" 顯示的檔案大小是位元組,但是我們更加習慣的是千位元組用 KB 顯示,兆位元組用 MB 顯示,而 "-h" 選項就是按照人們習慣的單位顯示檔案大小的,例如:

[root@localhost ~]# ls -lh
總用量44K
-rw-------.1 root root 1.2K 1 月 14 18:18 anaconda-ks.cfg
-rw-r-r--.1 root root 25K 1 月 14 18:17 install.log
-rw-r-r--.1 root root 7.6K 1 月 14 18:17 install.log.syslog

四、Linux mkdir命令:建立目錄(資料夾)

mkdir 命令,是 make directories 的縮寫,用於建立新目錄,此命令所有使用者都可以使用。

mkdir 命令的基本格式為:

[root@localhost ~]# mkdir [-mp] 目錄名

  • -m 選項用於手動配置所建立目錄的許可權,而不再使用預設許可權。
  • -p 選項遞迴建立所有目錄,以建立 /home/test/demo 為例,在預設情況下,你需要一層一層的建立各個目錄,而使用 -p 選項,則系統會自動幫你建立 /home、/home/test 以及 /home/test/demo。


【例 1】建立目錄。

[root@localhost ~]#mkdir cangls
[root@localhost ~]#ls
anaconda-ks.cfg cangls install.log install.log.syslog

我們建立一個名為 cangls 的目錄,通過 ls 命令可以檢視到這個目錄已經建立。注意,我們在建立目錄的時候使用的是相對路徑,所以這個目錄被建立到當前目錄下。

【例 2】使用 -p 選項遞迴建立目錄。

[root@localhost ~]# mkdir lm/movie/jp/cangls
mkdir:無法建立目錄"lm/movie/jp/cangls":沒有那個檔案或目錄
[root@localhost ~]# mkdir -p lm/movie/jp/cangls
[root@localhost ~]# ls
anaconda-ks.cfg cangls install.log install.log.syslog lm
[root@localhost ~]# ls lm/
movie
#這裡只檢視一級子目錄,其實後續的jp目錄、cangls目錄都已經建立


【例 3】使用 -m 選項自定義目錄許可權。

[root@localhost ~]# mkdir -m 711 test2
[root@localhost ~]# ls -l
drwxr-xr-x  3 root  root 4096 Jul 18 12:50 test
drwxr-xr-x  3 root  root 4096 Jul 18 12:53 test1
drwx--x--x  2 root  root 4096 Jul 18 12:54 test2

仔細看上面的許可權部分,也就是 ls 命令輸出的第一列資料(綠色部分),test 和 test1 目錄由於不是使用 -m 選項設定訪問許可權,因此這兩個目錄採用的是預設許可權(這裡的預設許可權值是 755,後續章節再詳細介紹預設許可權)。

而在建立 test2 時,使用了 -m 選項,通過設定 711 許可權值來給予新的目錄 drwx--x--x 的許可權,有關許可權值的具體含義也放到後續章節介紹。

五、Linux touch命令:建立檔案及修改檔案時間戳

既然知道了如何在 Linux 系統中建立目錄,接下來你可能會想在這些目錄中建立一些檔案,可以使用touch 命令。

需要注意的是,touch 命令不光可以用來建立檔案(當指定操作檔案不存在時,該命令會在當前位置建立一個空檔案),此命令更重要的功能是修改檔案的時間引數(但當檔案存在時,會修改此檔案的時間引數)。

Linux 系統中,每個檔案主要擁有 3 個時間引數(通過 stat 命令進行檢視),分別是檔案的訪問時間、資料修改時間以及狀態修改時間:

  • 訪問時間(Access Time,簡稱 atime):只要檔案的內容被讀取,訪問時間就會更新。例如,使用 cat 命令可以檢視檔案的內容,此時檔案的訪問時間就會發生改變。
  • 資料修改時間(ModifyTime,簡稱 mtime):當檔案的內容資料發生改變,此檔案的資料修改時間就會跟著相應改變。
  • 狀態修改時間(ChangeTime,簡稱 ctime):當檔案的狀態發生變化,就會相應改變這個時間。比如說,如果檔案的許可權或者屬性發生改變,此時間就會相應改變。


touch 命令的基本格式如下:

[root@localhost ~]# touch [選項] 檔名

選項:

  • -a:只修改檔案的訪問時間;
  • -c:僅修改檔案的時間引數(3 個時間引數都改變),如果檔案不存在,則不建立新檔案。
  • -d:後面可以跟欲修訂的日期,而不用當前的日期,即把檔案的 atime 和 mtime 時間改為指定的時間。
  • -m:只修改檔案的資料修改時間。
  • -t:命令後面可以跟欲修訂的時間,而不用目前的時間,時間書寫格式為YYMMDDhhmm


可以看到,touch 命令可以只修改檔案的訪問時間,也可以只修改檔案的資料修改時間,但是不能只修改檔案的狀態修改時間。因為,不論是修改訪問時間,還是修改檔案的資料時間,對檔案來講,狀態都會發生改變,即狀態修改時間會隨之改變(更新為操作當前檔案的真正時間)。

【例 1】 touch 命令建立檔案。

[root@localhost ~]#touch bols
#建立名為 bols 的空檔案


【例 2】 在例 1 的基礎上修改檔案的訪問時間。

[root@localhost ~]#ll --time=atime bols
#檢視檔案的訪問時間
-rw-r--r-- 1 root root 0 Sep 25 21:23 bols
#檔案上次的訪問時間為 9 月 25 號 21:23
[root@localhost ~]#touch bols
[root@localhost ~]#ll --time=atime bols
-rw-r--r-- 1 root root 0 May 15 16:36 bols
#而如果檔案已經存在,則也不會報錯,只是會修改檔案的訪問時間。


【例 3】 修改 bols 檔案的 atime 和 mtime。

[root@localhost ~]# touch -d "2017-05-04 15:44" bols
[root@localhost ~]# ll bols; ll --time=atime bols; ll --time=ctime bols
-rw-r--r-- 1 root root 0 May 4 2017 bols
-rw-r--r-- 1 root root 0 May 4 2017 bols
-rw-r--r-- 1 root root 0 Sep 25 21:40 bols
#ctime不會變為設定時間,但更新為當前伺服器的時間

六、Linux ln命令:建立連結(硬連結和軟連結)檔案

如果要想說清楚 ln 命令,則必須先解釋下 ext 檔案系統(Linux 檔案系統)是如何工作的。我們在前面講解了分割槽的格式化就是寫入檔案系統,而我們的 Linux 目前使用的是 ext4 檔案系統。如果用一張示意圖來描述 ext4 檔案系統,則可以參考圖 1。



圖 1 ext4 檔案系統示意圖


ext4 檔案系統會把分割槽主要分為兩大部分(暫時不提超級塊):小部分用於儲存檔案的 inode (i 節點)資訊;剩餘的大部分用於儲存 block 資訊。

inode 的預設大小為 128 Byte,用來記錄檔案的許可權(r、w、x)、檔案的所有者和屬組、檔案的大小、檔案的狀態改變時間(ctime)、檔案的最近一次讀取時間(atime)、檔案的最近一次修改時間(mtime)、檔案的資料真正儲存的 block 編號。每個檔案需要佔用一個 inode。大家如果仔細檢視,就會發現 inode 中是不記錄檔名的,那是因為檔名記錄在檔案所在目錄的 block 中。

block 的大小可以是 1KB、2KB、4KB,預設為 4KB。block 用於實際的資料儲存,如果一個 block 放不下資料,則可以佔用多個 block。例如,有一個 10KB 的檔案需要儲存,則會佔用 3 個 block,雖然最後一個 block 不能佔滿,但也不能再放入其他檔案的資料。這 3 個 block 有可能是連續的,也有可能是分散的。

由此,我們可以知道以下 2 個重要的資訊:

  1. 每個檔案都獨自佔用一個 inode,檔案內容由 inode 的記錄來指向;
  2. 如果想要讀取檔案內容,就必須藉助目錄中記錄的檔名找到該檔案的 inode,才能成功找到檔案內容所在的 block 塊;


瞭解了 Linux 系統底層檔案的儲存狀態後,接下來學習 ln 命令。

ln 命令用於給檔案建立連結,根據 Linux 系統儲存檔案的特點,連結的方式分為以下 2 種:

  • 軟連結:類似於 Windows 系統中給檔案建立快捷方式,即產生一個特殊的檔案,該檔案用來指向另一個檔案,此連結方式同樣適用於目錄。
  • 硬連結:我們知道,檔案的基本資訊都儲存在 inode 中,而硬連結指的就是給一個檔案的 inode 分配多個檔名,通過任何一個檔名,都可以找到此檔案的 inode,從而讀取該檔案的資料資訊。


ln 命令的基本格式如下:

[root@localhost ~]# ln [選項] 原始檔 目標檔案

選項:

  • -s:建立軟連結檔案。如果不加 "-s" 選項,則建立硬連結檔案;
  • -f:強制。如果目標檔案已經存在,則刪除目標檔案後再建立連結檔案;


【例 1】建立硬連結:

[root@localhost ~]# touch cangls
[root@localhost ~]# ln /root/cangls /tmp
#建立硬連結檔案,目標檔案沒有寫檔名,會和原名一致
#也就是/tmp/cangls 是硬連結檔案


【例 2】建立軟連結:

[root@localhost ~]# touch bols
[root@localhost ~]# In -s /root/bols /tmp
#建立軟連結檔案

這裡需要注意的是,軟連結檔案的原始檔必須寫成絕對路徑,而不能寫成相對路徑(硬連結沒有這樣的要求);否則軟連結檔案會報錯。這是初學者非常容易犯的錯誤。

七、Linux cp命令:複製檔案和目錄

cp 命令,主要用來複制檔案和目錄,同時藉助某些選項,還可以實現複製整個目錄,以及比對兩檔案的新舊而予以升級等功能。

cp 命令的基本格式如下:

[root@localhost ~]# cp [選項] 原始檔 目標檔案

選項:

  • -a:相當於 -d、-p、-r 選項的集合,這幾個選項我們一一介紹;
  • -d:如果原始檔為軟連結(對硬連結無效),則複製出的目標檔案也為軟連結;
  • -i:詢問,如果目標檔案已經存在,則會詢問是否覆蓋;
  • -l:把目標檔案建立為原始檔的硬連結檔案,而不是複製原始檔;
  • -s:把目標檔案建立為原始檔的軟連結檔案,而不是複製原始檔;
  • -p:複製後目標檔案保留原始檔的屬性(包括所有者、所屬組、許可權和時間);
  • -r:遞迴複製,用於複製目錄;
  • -u:若目標檔案比原始檔有差異,則使用該選項可以更新目標檔案,此選項可用於對檔案的升級和備用。


需要注意的是,原始檔可以有多個,但這種情況下,目標檔案必須是目錄才可以。

這裡的軟連結,類似於 Windows 系統中的快捷方式,而硬連結則是透過檔案系統的 inode 號產生一個新的檔名。無論是複製軟連結還是硬連結,都不是複製原始檔。有關軟連結和硬連結更詳細的介紹,可閱讀《Linux ln命令》一節。


【例 1】cp 命令基本用法

cp 命令既可以複製檔案,也可以複製目錄。我們先來看看如何複製檔案,例如:

[root@localhost ~]# touch cangls
#建立原始檔
[root@localhost ~]# cp cangls /tmp/
#把原始檔不改名複製到 /tmp/ 目錄下

如果需要改名複製,則命令如下:

[root@localhost ~]# cp cangls /tmp/bols
#改名複製

如果複製的目標位置已經存在同名的檔案,則會提示是否覆蓋,因為 cp 命令預設執行的是“cp -i”的別名,例如:

[root@localhost ~]# cp cangls /tmp/
cp:是否覆蓋"/tmp/cangls"?y
#目標位置有同名檔案,所以會提示是否覆蓋

接下來我們看看如何複製目錄,其實複製目錄只需使用“-r”選項即可,例如:

[root@localhost ~]# mkdir movie
#建立測試目錄
[root@localhost ~]# cp -r /root/movie/ /tmp/
#目錄原名複製


【例 2】複製軟連結檔案
如果原始檔不是一個普通檔案,而是一個軟連結檔案,那麼是否可以複製軟連結的屬性呢?我們試試:

[root@localhost ~]# ln -s /root/cangls /tmp/cangls_slink
#建立一個測試軟連結檔案/tmp/cangls_slink
[root@localhost ~]# ll /tmp/cangls_slink
lrwxrwxrwx 1 root root 12 6 月 14 05:53 /tmp/cangls_slink -> /root/cangls
#原始檔本身就是一個軟連結檔案
[root@localhost ~]# cp /tmp/cangls_slink /tmp/cangls_t1
#複製軟連結檔案,但是不加"-d"選項
[root@localhost ~]# cp -d /tmp/cangls_slink /tmp/cangls_t2
#複製軟連結檔案,加入"-d"選項
[root@localhost ~]# ll /tmp/cangls_t1 /tmp/cangls_t2
-rw-r--r-- 1 root root 0 6月 14 05:56 /tmp/cangls_t1
#會發現不加"-d"選項,實際複製的是軟連結的原始檔,而不是軟連結檔案
lrwxrwxrwx 1 root root 12 6 月 14 05:56/tmp/ cangls_t2-> /root/cangls
#而如果加入了"-d"選項,則會複製軟連結檔案

這個例子說明,如果在複製軟連結檔案時不使用 "-d" 選項,則 cp 命令複製的是原始檔,而不是軟連結檔案;只有加入了 "-d" 選項,才會複製軟連結檔案。請大家注意,"-d" 選項對硬連結是無效的。

【例 3】保留原始檔屬性複製
我們發現,在執行復制命令後,目標檔案的時間會變成複製命令的執行時間,而不是原始檔的時間。例如:

[root@localhost ~]# cp /var/lib/mlocate/mlocate.db /tmp/
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----1 root slocate2328027 6月 14 02:08/var/lib/mlocate/mlocate.db
#注意原始檔的時間和所屬組
[root@localhost ~]#ll /tmp/mlocate.db
-rw-r----- 1 root root2328027 6 月 14 06:05/tmp/mlocate.db
#由於複製命令由root使用者執行,所以目標檔案的所屬組為了root,而且時間也變成了複製命令的執行時間

而當我們執行備份、曰志備份的時候,這些檔案的時間可能是一個重要的引數,這就需執行 "-p" 選項了。這個選項會保留原始檔的屬性,包括所有者、所屬組和時間。例如:

[root@localhost ~]# cp -p /var/lib/mlocate/mlocate.db /tmp/mlocate.db_2
#使用"-p"選項
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db /tmp/mlocate.db_2
-rw-r----- root slocate 2328027 6月 14 02:08 /tmp/mlocate.db_2
-rw-r----- root slocate 2328027 6月 14 02:08 /var/lib/mlocate/mlocate.db
#原始檔和目標檔案的所有屬性都一致,包括時間

我們之前講過,"-a" 選項相當於 "-d、-p、-r" 選項,這幾個選項我們已經分別講過了。所以,當我們使用 "-a" 選項時,目標檔案和原始檔的所有屬性都一致,包括原始檔的所有者,所屬組、時間和軟連結性。使用 "-a" 選項來取代 "-d、-p、-r" 選項更加方便。

【例 4】"-l" 和 "-s" 選項
我們如果使用 "-l" 選項,則目標檔案會被建立為原始檔的硬連結;而如果使用了 "-s" 選項,則目標檔案會被建立為原始檔的軟連結。

這兩個選項和 "-d" 選項是不同的,"d" 選項要求原始檔必須是軟連結,目標檔案才會複製為軟連結;而 "-l" 和 "-s" 選項的原始檔只需是普通檔案,目標檔案就可以直接複製為硬連結和軟連結。例如:

[root@localhost ~]# touch bols
#建立測試檔案
[root@localhost ~]# ll -i bols
262154-rw-r--r-- 1 root root 0 6月 14 06:26 bols
#原始檔只是一個普通檔案,而不是軟連結檔案
[root@localhost ~]# cp -l /root/bols /tmp/bols_h
[root@localhost ~]# cp -s /root/bols /tmp/bols_s
#使用"-l" 和"-s"選項複製
[root@localhost ~]# ll -i /tmp/bols_h /tmp/bols_s
262154-rw-r--r-- 2root root 0 6 月 14 06:26/tmp/bols_h
#目標檔案 /tmp/bols_h 為原始檔的硬連結檔案
932113 lrwxrwxrwx 1 root root 10 6 月 14 06:27/tmp/bols_s -> /root/bols
#目標檔案 /tmp/bols_s 為原始檔的軟連結檔案

八、Linux rm命令:刪除檔案或目錄

當 Linux 系統使用很長時間之後,可能會有一些已經沒用的檔案(即垃圾),這些檔案不但會消耗寶貴的硬碟資源,還是降低系統的執行效率,因此需要及時地清理。

rm 是強大的刪除命令,它可以永久性地刪除檔案系統中指定的檔案或目錄。在使用 rm 命令刪除檔案或目錄時,系統不會產生任何提示資訊。此命令的基本格式為:

[root@localhost ~]# rm[選項] 檔案或目錄

選項:

  • -f:強制刪除(force),和 -i 選項相反,使用 -f,系統將不再詢問,而是直接刪除目標檔案或目錄。
  • -i:和 -f 正好相反,在刪除檔案或目錄之前,系統會給出提示資訊,使用 -i 可以有效防止不小心刪除有用的檔案或目錄。
  • -r:遞迴刪除,主要用於刪除目錄,可刪除指定目錄及包含的所有內容,包括所有的子目錄和檔案。


注意,rm 命令是一個具有破壞性的命令,因為 rm 命令會永久性地刪除檔案或目錄,這就意味著,如果沒有對檔案或目錄進行備份,一旦使用 rm 命令將其刪除,將無法恢復,因此,尤其在使用 rm 命令刪除目錄時,要慎之又慎。

【例 1】基本用法。
rm 命令如果任何選項都不加,則預設執行的是"rm -i 檔名",也就是在刪除一個檔案之前會先詢問是否刪除。例如:

[root@localhost ~]# touch cangls
[root@localhost ~]# rm cangls
rm:是否刪除普通空檔案"cangls"?y
#刪除前會詢問是否刪除


【例 2】刪除目錄。
如果需要刪除目錄,則需要使用"-r"選項。例如:

[root@localhost ~]# mkdir -p /test/lm/movie/jp
#遞迴建立測試目錄
[root@localhost ~]# rm /test
rm:無法刪除"/test/": 是一個目錄
#如果不加"-r"選項,則會報錯
[root@localhost ~]# rm -r /test
rm:是否進入目錄"/test"?y
rm:是否進入目錄"/test/lm/movie"?y
rm:是否刪除目錄"/test/lm/movie/jp"?y
rm:是否刪除目錄"/test/lm/movie"?y
rm:是否刪除目錄"/test/lm"?y
rm:是否刪除目錄"/test"?y
#會分別詢問是否進入子目錄、是否刪除子目錄

大家會發現,如果每級目錄和每個檔案都需要確認,那麼在實際使用中簡直是災難!

【例 3】強制刪除。
如果要刪除的目錄中有 1 萬個子目錄或子檔案,那麼普通的 rm 刪除最少需要確認 1 萬次。所以,在真正刪除檔案的時候,我們會選擇強制刪除。例如:

[root@localhost ~]# mkdir -p /test/lm/movie/jp
#重新建立測試目錄
[root@localhost ~]# rm -rf /test
#強制刪除,一了百了

加入了強制功能之後,刪除就會變得很簡單,但是需要注意,資料強制刪除之後無法恢復,除非依賴第三方的資料恢復工具,如 extundelete 等。但要注意,資料恢復很難恢復完整的資料,一般能恢復 70%~80% 就很難得了。所以,與其把寶壓在資料恢復上,不如養成良好的操作習慣。

雖然 "-rf" 選項是用來刪除目錄的,但是刪除檔案也不會報錯。所以,為了使用方便,一般不論是刪除檔案還是刪除目錄,都會直接使用 "-rf" 選項。

九、Linux mv命令:移動檔案或改名

mv 命令(move 的縮寫),既可以在不同的目錄之間移動檔案或目錄,也可以對檔案和目錄進行重新命名。該命令的基本格式如下:

[root@localhost ~]# mv 【選項】 原始檔 目標檔案

選項:

  • -f:強制覆蓋,如果目標檔案已經存在,則不詢問,直接強制覆蓋;
  • -i:互動移動,如果目標檔案已經存在,則詢問使用者是否覆蓋(預設選項);
  • -n:如果目標檔案已經存在,則不會覆蓋移動,而且不詢問使用者;
  • -v:顯示檔案或目錄的移動過程;
  • -u:若目標檔案已經存在,但兩者相比,原始檔更新,則會對目標檔案進行升級;


需要注意的是,同 rm 命令類似,mv 命令也是一個具有破壞性的命令,如果使用不當,很可能給系統帶來災難性的後果。

【例 1】移動檔案或目錄。

[root@localhost ~]# mv cangls /tmp
#移動之後,原始檔會被刪除,類似剪下
[root@localhost ~]# mkdir movie
[root@localhost ~]# mv movie/ /tmp
#也可以移動目錄。和 rm、cp 不同的是,mv 移動目錄不需要加入 "-r" 選項

如果移動的目標位置已經存在同名的檔案,則同樣會提示是否覆蓋,因為 mv 命令預設執行的也是 "mv -i" 的別名,例如:

[root@localhost ~]# touch cangls
#重新建立檔案
[root@localhost ~]# mv cangls /tmp
mv:縣否覆蓋"tmp/cangls"?y
#由於 /tmp 目錄下已經存在 cangls 檔案,所以會提示是否覆蓋,需要手工輸入 y 覆蓋移動


【例 2】強制移動。
之前說過,如果目標目錄下已經存在同名檔案,則會提示是否覆蓋,需要手工確認。這時如果移動的同名檔案較多,則需要一個一個檔案進行確認,很不方便。

如果我們確認需要覆蓋已經存在的同名檔案,則可以使用 "-f" 選項進行強制移動,這就不再需要使用者手工確認了。例如:

[root@localhost ~]# touch cangls
#重新建立檔案
[root@localhost ~]# mv -f cangls /tmp
#就算 /tmp/ 目錄下已經存在同名的檔案,由於"-f"選項的作用,所以會強制覆蓋


【例 3】不覆蓋移動。
既然可以強制覆蓋移動,那也有可能需要不覆蓋的移動。如果需要移動幾百個同名檔案,但是不想覆蓋,這時就需要 "-n" 選項的幫助了。例如:

[root@localhost ~]# ls /tmp
/tmp/bols /tmp/cangls
#在/tmp/目錄下已經存在bols、cangls檔案了
[root@localhost ~]# mv -vn bols cangls lmls /tmp/、
"lmls"->"/tmp/lmls"
#再向 /tmp/ 目錄中移動同名檔案,如果使用了 "-n" 選項,則可以看到只移動了 lmls,而同名的 bols 和 cangls 並沒有移動("-v" 選項用於顯示移動過程)


【例 4】改名。
如果原始檔和目標檔案在同一目錄中,那就是改名。例如:

[root@localhost ~]# mv bols lmls
#把 bols 改名為 lmls

目錄也可以按照同樣的方法改名。

【例 5】顯示移動過程。
如果我們想要知道在移動過程中到底有哪些檔案進行了移動,則可以使用 "-v" 選項來檢視詳細的移動資訊。例如:

[root@localhost ~]# touch test1.txt test2.txt test3.txt
#建立三個測試檔案
[root@localhost ~]# mv -v *.txt /tmp
"test1.txt" -> "/tmp/test1.txt"
"test2.txt" -> "/tmp/test2.txt"
"test3.txt" -> "/tmp/test3.txt"
#加入"-v"選項,可以看到有哪些檔案進行了移動

十、Linux環境變數及作用

變數是計算機系統用於儲存可變值的資料型別,我們可以直接通過變數名稱來提取到對應的變數值。在 Linux 系統中,環境變數是用來定義系統執行環境的一些引數,比如每個使用者不同的家目錄(HOME)、郵件存放位置(MAIL)等。

值得一提的是,Linux 系統中環境變數的名稱一般都是大寫的,這是一種約定俗成的規範。

我們可以使用 env 命令來檢視到 Linux 系統中所有的環境變數,執行命令如下:

[root@localhost ~]# env
ORBIT_SOCKETDIR=/tmp/orbit-root
HOSTNAME=livecd.centos
GIO_LAUNCHED_DESKTOP_FILE_PID=2065
TERM=xterm
SHELL=/bin/bash
......

Linux 系統能夠正常執行並且為使用者提供服務,需要數百個環境變數來協同工作,但是,我們沒有必要逐一學習每個變數,這裡給大家列舉了 10 個非常重要的環境變數,如表 1 所示。

表 1 Linux系統中重要的10個環境變數
環境變數名稱作用
HOME 使用者的主目錄(也稱家目錄)
SHELL 使用者使用的 Shell 直譯器名稱
PATH 定義命令列直譯器搜尋使用者執行命令的路徑
EDITOR 使用者預設的文字直譯器
RANDOM 生成一個隨機數字
LANG 系統語言、語系名稱
HISTSIZE 輸出的歷史命令記錄條數
HISTFILESIZE 儲存的歷史命令記錄條數
PS1 Bash直譯器的提示符
MAIL 郵件儲存路徑


Linux 作為一個多使用者多工的作業系統,能夠為每個使用者提供獨立的、合適的工作執行環境,因此,一個相同的環境變數會因為使用者身份的不同而具有不同的值。

例如,使用下述命令來檢視 HOME 變數在不同使用者身份下都有哪些值:

[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# su - user1  <--切換到 user1 使用者身份
[user1@localhost ~]$ echo $HOME
/home/user1

這裡的 su 命令可以臨時切換使用者身份,此命令的具體用法會在後續章節做詳細介紹。

其實,環境變數是由固定的變數名與使用者或系統設定的變數值兩部分組成的,我們完全可以自行建立環境變數來滿足工作需求。例如,設定一個名稱為 WORKDIR 的環境變數,方便使用者更輕鬆地進入一個層次較深的目錄,執行命令如下:

[root@localhost ~]# mkdir /home/work1
[root@localhost ~]# WORKDIR=/home/work1
[root@localhost ~]# cd $WORKDIR
[root@localhost work1]# pwd
/home/work1

但是,這樣的環境變數不具有全域性性,作用範圍也有限,預設情況下不能被其他使用者使用。如果工作需要,可以使用 export 命令將其提升為全域性環境變數,這樣其他使用者就可以使用它了:

[root@localhost work1]# su user1  <-- 切換到 user1,發現無法使用 WORKDIR 自定義變數
[user1@localhost ~]$ cd $WORKDIR
[user1@localhost ~]$ echo $WORKDIR

[user1@localhost ~]$ exit <--退出user1身份
[root@localhost work1]# export WORKDIR
[root@localhost work1]# su user1
[user1@localhost ~]$ cd $WORKDIR
[user1@localhost work1]$ pwd
/home/work1