You are on page 1of 134

UNIX / Linux 系統基礎入門

使用 Debian GNU/Linux

寫在前頭
為了讓更多初學者可以更容易入門 UNIX / Linux ,筆者將自己所學
以及整理網路資源,用淺顯易懂的方式寫成這份文件,希望能將自己的學習
經驗分享給大家。這份文件定位於『初學入門』的參考講義,至今內容仍持
續在擴充與修訂;假使各位對於文件有任何問題與建議,非常歡迎各位來信
指教,希望可以讓這份參考講義更為完美。

陳晏瑨 (Denny Yenjin Chen)


http://yenjinc.info/

更新紀錄
2006-2-23-AM2:10 —『一二篇全部內容』完成
2006-2-23-AM2:00 —『第三篇、第四篇大綱』完成
2006-2-22-PM10:40 —『7-5 文字過濾器』完成
2006-2-22- PM3:50 —『7-4 檔案搜尋』完成
.
.
.
.
.
Contents
目錄

第一篇:認識 Linux 系統
第 1 章 緒論
1-1 UNIX 學習建議 .........................................................................5
1-2 學習心態 .................................................................................6
1-3 線上教學網 ..............................................................................7
1-4 Linux 能做什麼?.....................................................................7
1-5 該學哪個版本?........................................................................9
1-6 線上資源 ...............................................................................11

第 2 章 Linux 簡介
2-1 什麼是 Linux? ......................................................................14
2-2 Linux 發行套件 ......................................................................15
2-3 取得 Linux ............................................................................17

第 3 章 安裝 Linux
3-1 安裝的流程 ............................................................................18
3-2 磁碟分割與目錄規劃 ...............................................................18
3-3 安裝 Debian GNU/Linux........................................................24

第 4 章 系統結構與目錄架構
4-1 Linux 系統結構 ......................................................................34
4-2 Linux 目錄架構 ......................................................................36

-1-
第二篇:Linux 基礎使用
第 5 章 上機使用 Linux
5-1 登入的方式 ............................................................................40
5-2 登入與登出 ............................................................................41
5-3 登入後的環境 .........................................................................42
5-4 切換使用者 ............................................................................44
5-5 開機與關機 ............................................................................48

第 6 章 認識 Bash Shell
6-1 基礎概念 ...............................................................................51
6-2 相對路徑與絕對路徑 ...............................................................54
6-3 資料流重導向 .........................................................................56
6-4 管線應用 ...............................................................................61
6-5 線上資源 ...............................................................................62

第 7 章 Linux 基本工具
7-1 檔案與目錄操作......................................................................63
7-2 打包與壓縮 ............................................................................75
7-3 更改檔案權限 .........................................................................82
7-4 搜尋檔案 ...............................................................................92
7-5 文字過濾器 ......................................................................... 102
7-6 萬用字元 ............................................................................ 108
7-7 正規表示式 ......................................................................... 110

第 8 章 文字編輯器
8-1 Vi 模式介紹 ........................................................................ 112
8-2 Vi 指令操作 ........................................................................ 113

-2-
第三篇:Linux 基礎管理
第 9 章 帳號管理
9-1 使用者與群組概念................................................................ 117
9-2 相關設定檔 ......................................................................... 118
9-3 基本指令操作 ...................................................................... 119

第 10 章 套件管理
10-1 背景知識 .......................................................................... 120
10-2 套件管理工具 .................................................................... 121
10-3 原始碼安裝軟體................................................................. 122
10-4 手動安裝 (一) .................................................................... 123
10-5 手動安裝 (二) .................................................................... 124

第 11 章 行程管理
11-1 背景與前景工作................................................................. 125
11-2 基本指令操作 .................................................................... 126

第 12 章 工作排程
12-1 背景知識 .......................................................................... 127
12-2 相關設定檔 ....................................................................... 128
12-3 基本指令操作 .................................................................... 129

-3-
第四篇:Linux 進階管理
第 13 章 檔案系統管理
13-1 磁碟分割與格式化 ............................................................. 130
13-2 檔案系統掛載 .................................................................... 130
13-3 相關設定檔 ....................................................................... 130
13-4 相關工具使用 .................................................................... 130
13-5 磁碟配額 .......................................................................... 130

第 14 章 系統開機流程
14-1 開機管理程式 .................................................................... 131
14-2 系統運作層級 .................................................................... 131
14-3 相關設定檔 ....................................................................... 131
14-4 相關工具使用 .................................................................... 131

第 15 章 系統備份與救援
15-1 備份策略 .......................................................................... 132
15-2 相關工具使用 .................................................................... 132
15-3 救援模式 (一) .................................................................... 132
15-4 救援模式 (二) .................................................................... 132

第 16 章 系統紀錄檢視
16-1 背景知識 .......................................................................... 133
16-2 相關設定檔 ....................................................................... 133
16-3 相關工具使用 .................................................................... 133

-4-
認識 Linux 系統

第 1 章 緒論
1-1 UNIX 學習建議

首先筆者轉貼一則由『國立政治大學–應用數學系』蔡炎龍教授
所提出的『Unix系統基本學習建議』。
(http://riemann.math.nccu.edu.tw/forum/viewtopic.php?t=7)

以下為引述內容:

Unix 學習我大致這樣建議。你用了不久就會發現, 雖然都叫 Unix 指令, 但多多少


少有細微的不同操作方式。我們就統一使用 bash。Unix 命名有時挺有趣, 有時挺爆笑,
有時挺無厘頭。不過這不是今天的重點。

我們要學好 Unix, 我的建議有以下步驟:


1. 學習 bash 基本指令。簡單的說, 就是你在視窗型界面中, 想要開一個檔案,
看檔案內容, 在檔案夾中遊走, 拷貝擋案... 你要會用指令來做。一開始有點
麻煩, 可是我們會慢慢介紹一些很酷的手法。這些手法是單純用圖形界面
很難達到的。
2. 學習 vi/vim 編輯器。Unix 幾乎所有我們可以玩的東西都是純文字檔, 用純
文字檔可以控制的東西會超乎你想像的大。而要控制這些東西, 當然要有個
編輯器。雖然我其實是 vi 的「仇家」emacs 派的人, 可是我還是發現 vi
勢力還是比較大, 你在現代 Unix 系統, 幾乎都有 vi 存在。
3. 學習 regular expression。這是真正酷的地方, 進行到這裡, 你可能不會再
想用完全不給你指令界面的東西。
有沒有哪裡有大概介紹我們要學的東西呢? 有幾個地方都有, 我先推薦其中一個, 相
當有名氣的「鳥哥的 Linux 私房菜」之基礎學習篇:
http://linux.vbird.org/linux_basic/

這裡面第三部份, 「學習 Shell 與 Shell scripts」就是我們大家都要學的。

-5-
1-2 學習心態

Linux 跟大家所認識的 Windows 是兩個完全不同的作業系統。


拿 Windows 的使用方式套用在 Linux 上,或者是常拿 Windows 來和
Linux 做比較,筆者認為這些學習方式都不是很恰當。

Linux 與 Windows 是不同的作業系統,各有各的特色與強項。


能解決問題的工具,就是好工具;能夠選擇『合適』的工具來幫助您解決
『適合的問題』這才是最重要的。

各位可以抱持著一種『重頭學習』一個『新的』作業系統的心態,
撇開原本操作其他系統的觀念,以全新的角度,用心去體驗 Linux 所帶來的
強大功能與特色!這樣的學習方式,相信您也會感覺到比較有趣呢!

培養正確的學習心態,對於學習 Linux 絕對有『事半功倍』的效果。


筆者將幾個不錯的網路連結整理如下,各位可以看看前輩們的學習歷程以及
經驗分享,相信這也是個不錯的學習。

相關資源:

『GNU/Linux 初學之旅』
— http://www.study-area.org/tips/linux_entry.htm
— http://www.study-area.org/tips/linux_entry.pdf

『網中人的 Linux 學習觀』


— http://www.study-area.org/linux/learning/learning_linux.htm

『鳥哥的私房菜–如何學習 Linux』
— http://linux.vbird.org/linux_basic/0120howtolinux.php

『鳥哥的私房菜–Linux 的學習曲線,一個老人家的建議!』
— http://linux.vbird.org/new_linux.php

學習 Linux,手上最好要有一本參考書籍,假使沒有打算買
那也沒有關係,因為筆者將在下一章節中介紹一些 Linux 線上教學資源。

-6-
1-3 線上教學網

筆者整理一些教學資源給各位參考,這些連結除了中文的 Linux
教學網站之外,還有英文的 Unix Administration Courses。想當初筆者
自己剛學習 Linux 時,也是由這些教學網站來入門的呢!

線上教學網站:

『鳥哥的私房菜』
— http://linux.vbird.org/

『柏青哥的 SuSE Linux』


— http://paching.myweb.hinet.net/

『Study-Area–學習 Linux』
— http://www.study-area.org/linux/linuxfr.htm

『LLoyd Huang Hand Book』


— http://kalug.linux.org.tw/~lloyd/LLoyd_Hand_Book/book/

『UNIX Administration Course』


— http://www.futuretech.blinkenlights.nl/admin/

『Online system administration courses』


— http://www.uwsg.iu.edu/usail/library/courses.html

如果各位想買 Linux 參考書籍,筆者推薦您到『天瓏資訊圖書』—


http://www.tenlong.com.tw/。找一幾本您有興趣的書,親自到書店把它
看完,這樣不僅『學』到了,而且也『省』到了! 

1-4 Linux 能做什麼?

簡單的說,Linux 是一套『作業系統』;一個跟 Windows 類似的


作業系統。您在 Windows 上能做的事情,來到 Linux 一樣都可以做。

-7-
Linux 擁有圖形化的操作介面,您可以在上面做任何的桌面應用以及
辦公室應用;可以拿 Linux 開發程式、架設網路伺服器。玩家們甚至可以在
Linux 上打線上遊戲—魔獸世界;透過 WINE (http://www.winehq.com/)
您還可以在 Linux 上跑 Windows 的應用程式呢!(很神奇吧!)

Linux 有一個吸引人的特點—『您可以不用安裝防毒軟體!』大部份的
病毒以及後門程式多半針對 Windows 系統而寫,這些惡意程式對於 Linux
系統是一點作用都沒有。

Linux 的桌面應用:

關於 Linux Desktop 應用,國內有一本 Ubuntu『玩全』手冊,顧名思義就是要


教您『大玩 Linux !』這本書是由 Ubuntu-TW 社群人親自著筆完成,對於 Linux
Desktop 應用有興趣的朋友不妨參考。

『新書廣告:次世代 Linux - Ubuntu 玩全手冊』


— http://blog.linux.org.tw/~jserv/archives/001847.html

『[ CONTENTS / 目錄] (PDF 格式)』


— http://www.cqis.ncku.edu.tw/~dbtsai/index.pdf

『[ PREFACE / 推薦序] (PDF 格式)』


— http://www.cqis.ncku.edu.tw/~dbtsai/perface.pdf

如果各位對於 Linux Desktop 的相關應用軟體有興趣,不妨參考 OSSACC


(全國中小學校園—自由軟體應用諮詢中心) 所整理的軟體總表。

『Linux 應用軟體總表』
— http://www.ossacc.org/software/application/index_html

『Linux 程式系統總表』
— http://www.ossacc.org/software/system/

Linux 系統有著 UNIX 的血緣,承襲了良好的系統穩定性以及多人多工


的處理能力,在網路功能與效能上更有極佳的表現;除了桌面應用以外,
Linux 最大的特色在於『網路應用』。

目前很多入口網站 (Portal)、資料庫系統、電子商務網站等,均建構在

-8-
Linux 作業系統上;公司企業將 Linux 作為伺服器應用,知名的 Google
Inc.、Amazon.com, Inc 等,都是絕佳的典範。

透過 NetCraft:http://news.netcraft.com/,您可以看到世界上
有龐大數量的網路伺服器,全部都是建立在 Linux 平台上。

除此之外,有個著名的『網路伺服軟體應用組合』縮寫名稱『LAMP』
也是 Linux 網路應用的典型例子;這個 LAMP 架構常被用來建立公司企業
以及個人網站服務。

LAMP:

LAMP 是一個縮寫,它指一組通常一起使用來運行動態網站或者伺服器的自由軟體:
* Linux, 作業系統;
* Apache, 網頁伺服器;
* MySQL, 資料庫管理系統 (或者資料庫伺服器);
* Perl, PHP, 和/或者 Python, 腳本語言。

From 維基百科 (http://zh.wikipedia.org/wiki/LAMP)

Linux 是一套『作業系統』,作為人類與電腦硬體之間的溝通橋樑,
大家可以透過 Linux 來達成自己想要的任務。Linux 能做的事情遠多過於
我們所能想到的;與其思考它能做什麼,不如直接問『要拿它做什麼?』
因為我們要做的事情,Linux 它都能做! (沒錯,這就是 Linux。 )

1-5 該學哪個版本?

初學者常會對 Linux 發行版本 (Linux Distribution) 感到混淆;


面對著全球一百多種的 Distribution (比較熱門的有十幾種) 而不知道
該選擇哪一套。

精確的說,『Linux』只能算是個『kernel』(作業系統的核心);
常見的 Linux 發行版本則是『Linux Kernel + 開放源碼應用程式』
的一項產物 (套裝 / 發行版本)。

-9-
這些 Linux 發行版本,它們的核心都是使用『Linux kernel』,
所使用的公用程式也大都是『GNU 軟體』以及其他『開放源碼軟體
(Open Source Software) 』。

它們最主要的差別在於,有些 Linux 發行版本會擁有一些專門為了


自己的版本所設計的『專屬工具』,這些專屬工具只屬於自己的發行版本,
並不會出現在別的發行版本。再來就是『套件管理方式』的不同;每個發行
版本的套件管理方式都不太相同,就連套件管理的『前端程式』也是每個版
本都不太一樣。除了這些『系統層級』的軟體會有所不同以外,至於系統的
核心 (Kernel) 以及最上層的應用程式 (Application) 基本上都會是一樣的。

底下是 Linux 發行版本簡單示意圖,用來描述其中的差異。

Linux Distribution 簡單示意圖


除了『系統層級』
Linux Kernel 的軟體會有所不同
以外,至於系統的
套件管理/ 系統層級軟體 核心以及最上層的
應用程式,基本上
Applications/ Open Source Software 都會是一樣的。

Linux Distribution:

大體而言,各個發行版本均有遵循 Linux Standard Base (LSB)


(http://www.linux-foundation.org/en/LSB) 以及 Filesystem Hierarchy Standard
(FHS) (http://www.pathname.com/fhs/),因此每個發行版本在『基本架構上』
幾乎是相同的,所使用的公用程式也大都是『GNU 軟體』以及其他『開放源碼軟體
(Open Source Software) 』。

所以當您熟悉一套 Linux 發行版本後,再轉換到其他版本時,其實


系統的操作都大同小異;不過在實務經驗上,仍然要熟習各個發行版本之間
,彼此的系統設定工具與套件管理方式。

每一個發行版本的『設計哲學』以及『管理方式』都不盡相同。
各位可以多嘗試不同的 distribution,然後選擇一套自己『特別喜歡』的
來深入研究;這樣的學習方式會更好玩,更有趣唷!

- 10 -
補充說明:

如果您還不確定自己該選擇哪一套 Linux 發行版本,那麼筆者推薦各位可以來


『Linux Distribution Chooser』(http://www.zegeniestudios.net/ldc/);
透過網站的問答,可以幫助您挑選到適合自己的 Linux 發行版本。

世界上到底有哪些 distribution? 這些不同的發行套件『彼此之間』有什麼好玩


有趣的東西? 想了解『哪個』Linux 發行版本在世界上『最熱門』嗎...?各位可以到
『DistroWatch』(http://distrowatch.gds.tuwien.ac.at/) 來找到這些答案哦!

1-6 線上資源

學習 Linux 除了看書以及實作之外,一定要學會『上網找資料』。
網路上的 Linux 資源非常豐富,若想學更多相關的知識,一定要多參考網路
資源。筆者在下方整理一些 Linux 其他的資源,提供給各位參考。

其他資源:

Linux 相關網站

『鳥哥的私房菜—網路連結』
— http://linux.vbird.org/othersites

『柏青哥的 SuSE Linux—Linux相關網站』


— http://paching.myweb.hinet.net/goodsite.htm

Linux 文獻計畫

『The Linux Documentation Project:TLDP』


— http://tldp.org/

『Chinese Linux Documentation Project:CLDP』


— http://www.linux.org.tw/CLDP/

- 11 -
Usenet 網上論壇

『comp.os.linux』
— http://groups.google.com.tw/groups/dir?sel=33583540

『tw.bbs.comp.linux』
— http://groups.google.com.tw/group/tw.bbs.comp.linux/topics

『國內 Linux 相關資源大本營—Sayya BBS』


— telnet://bbs.sayya.org/

假使您在學習 Linux 的過程中有任何問題,都可以到 Linux 討論區,


尋求網友的協助。透過討論區發問以及回答問題,可以幫助您提昇 Linux
戰鬥經驗值,使自己的技能更為純熟!筆者在下方整理一些討論區網站,
提供給各位參考。

在問問題之前,記得要先看過這篇『提問的智慧』哦!
— http://phorum.vbird.org/viewtopic.php?t=96

Linux 討論區網站:

『摩托學園討論區』
— http://moto.debian.org.tw/

『自由軟體技術交流網』
— http://freesf.tnc.edu.tw/

『KNOPPIX 中文交流網』
— http://knoppix.tnc.edu.tw/

『鳥哥的 Linux 新手討論區』


— http://phorum.vbird.org/

『酷!學園討論區』
— http://phorum.study-area.org/

- 12 -
『Ubuntu 正體中文站』
— http://www.ubuntu.org.tw/

『Linux 中文延伸套件(CLE) 討論區』


— http://cle.linux.org.tw/forum/

『Fedora 台灣愛用者社群』
— http://live.fect.com.tw/

『SuSE Linux 論壇』


— http://www.suse.idv.tw/

除了上述的討論區以外,若各位對於 Linux 有相關問題,也歡迎


寫信聯絡筆者 [yenjinc@yenjinc.info];筆者喜歡結交同好、分享心得,
我也熱意將所學分享給大家唷!

筆者在學習 Linux 時,養成一個『有問題就找 Google』的習慣。


根據經驗指示,幾乎在 Google 上面都可以找得到解決辦法;也就是說
『只要有 Google』,那麼就沒有解決不了的難題。

小道透漏:

學會使用 Google 來解決問題,這才是提昇能力的『究極法門』唷!


(http://www.google.com.tw/)、(http://www.google.com/linux)

- 13 -
第 2 章 Linux 簡介
2-1 什麼是 Linux?

簡單的說,Linux 它是一個『作業系統』作為人類與電腦硬體之間
的溝通橋樑,大家可以透過 Linux 來達成自己的工作任務。

Linux 是一套自由、開放、而且免費的作業系統,由於開放源碼
(Open Source) 的特點,您可以任意的修改 Linux;從最底層的核心
(Kernel) 以至於上層的應用程式 (Application),都可以依照自己的需求,
親自動手修改,直到滿意為止。

藉由『自由、開放、免費』等特性,Linux 越來越受到大眾的喜愛;
尤其是那些電腦技術專精至深的專家 (Hackers),更是愛不釋手呢!

Linux 的由來:

從 1970 年代至今,有個『全球最受歡迎』的作業系統叫做 UNIX;


當今的『Linux』則可以看作是 UNIX 的『免費流傳版本』之一。Linux
最早出現在 1991 年代,是由 Linus Torvalds 開發而成。

提到 Linux 的發展,那就要追溯到『Minix』的誕生了。當時的 UNIX


只能在『特定的主機上』才能運行,並且有『版權』的問題;所以當時在校
園中,舉凡有使用到 UNIX 的相關課程,都遇到了問題。

因此 Andrew Tanenbaum 在 1984 年,為了設計作業系統課程


之教學,就根據 UNIX 之構想,重新撰寫一套系統『Minix』(於 1986),
並讓『Minix』可在一般 x86 系統上運行。

『Minix』它是早期個人電腦所使用的 UNIX 版本之一,而所謂的


『UNIX-Like』系統 (意指從 UNIX 重新撰寫而成,並且類似 UNIX 的系統),
也從此誕生了。

到了 1991 年,Linus Torvalds 又把 Minix 拿來改寫,於是世界上

- 14 -
第一個『Linux』(Kernel) 就這樣出現了!至今 Linux 已經蓬勃發展,
並也成為了世界上相當重要的作業系統之一。

Linux 最大的特點在於它是一個開放源碼 (Open Source) 的作業系統


—擁有了像是『言論自由』一般的『自由』;您可以任意的修改 Linux,
直到滿意為止,所以 Linux 深受玩家們的熱愛。

Linux 能做的事情很多,多過於我們所能想到的。如同筆者在『1-4
Linux 能做什麼』章節所述 —您在 Windows 上能做的事情,來到 Linux
一樣都可以做,而且還能做更多!

Linux 相關簡介與發 展歷史:

『鳥哥的私房菜—什麼是 Linux』
— http://linux.vbird.org/linux_basic/0110whatislinux.php

『柏青哥的 SuSE Linux—Linux簡介』


— http://paching.myweb.hinet.net/lesson1.htm

『 Linux 維基百科,自由的百科全書』
— http://zh.wikipedia.org/wiki/Linux

『What is Linux』
— http://www.linux.org/info/

『 Unix History 發展圖表』


— http://www.levenez.com/unix/

『 Unix 發展史簡記』
— http://www.ndhu.edu.tw/~comput/elearning/others/unix/chap1/1_1.htm

2-2 Linux 發行套件

這些 Linux 發行版本,它們的核心都是使用『Linux kernel』,


所使用的公用程式也大都是『GNU 軟體』以及其他『開放源碼軟體
(Open Source Software) 』。

- 15 -
它們最主要的差別在於,有些 Linux 發行版本會擁有一些專門為了
自己的版本所設計的『專屬工具』,這些專屬工具只屬於自己的發行版本,
並不會出現在別的發行版本。再來就是『套件管理方式』的不同;每個發行
版本的套件管理方式都不太相同,就連套件管理的『前端程式』也是每個版
本都不太一樣。除了這些『系統層級』的軟體會有所不同以外,至於系統的
核心 (Kernel) 以及最上層的應用程式 (Application) 基本上都會是一樣的。

底下是 Linux 發行版本簡單示意圖,用來描述其中的差異。

Linux Distribution 簡單示意圖


除了『系統層級』
Linux Kernel 的軟體會有所不同
以外,至於系統的
套件管理/ 系統層級軟體 核心以及最上層的
應用程式,基本上
Applications/ Open Source Software 都會是一樣的。

Linux Distribution:

大體而言,各個發行版本均有遵循 Linux Standard Base (LSB)


(http://www.linux-foundation.org/en/LSB) 以及 Filesystem Hierarchy Standard
(FHS) (http://www.pathname.com/fhs/),因此每個發行版本在『基本架構上』
幾乎是相同的,所使用的公用程式也大都是『GNU 軟體』以及其他『開放源碼軟體
(Open Source Software) 』。

所以當您熟悉一套 Linux 發行版本後,再轉換到其他版本時,其實


系統的操作都大同小異;不過在實務經驗上,仍然要熟習各個發行版本之間
,彼此的系統設定工具與套件管理方式。

每一個發行版本的『設計哲學』以及『管理方式』都不盡相同。
各位可以多嘗試不同的 distribution,然後選擇一套自己『特別喜歡』的
來深入研究;這樣的學習方式會更好玩,更有趣唷!

- 16 -
2-3 取得 Linux

目前全球共有一百多種的 Distribution (比較熱門的有十幾種),


除了在各個 distribution 的官方網站可以下載之外,各位也可以從下列
連結來下載 Linux 安裝光碟。

下載位置:

『義守大學 FTP 檔案伺服器』


— http://ftp.isu.edu.tw/pub/Linux/

『 Linux Distributions』
— http://www.linux.org/dist/

『LinuxISO』
— http://www.linuxiso.org/

『DistroWatch』
— http://distrowatch.com/

- 17 -
第 3 章 安裝 Linux
3-1 安裝的流程

現在各家 Linux distribution 的安裝介面均已圖形化,這使得安裝


Linux 已經相當的容易;甚至有的 distribution 也只需要點選『Next』+
『OK』就可以安裝好系統。雖然安裝已變得非常容易,但是有些重要的觀念
還是必須了解才行。

在這裡,筆者把 Linux 的安裝簡化成四個流程:

1. 使用光碟開機 (於 BIOS 設定)。


2. 切割硬碟、格式化硬碟 (至少建立 /、SWAP )。
3. 複製檔案 (Copy) 到硬碟 (包含 Boot Loader)。
4. 重新開機,進入 Linux。

簡單來說,安裝 Linux 最精簡的過程,不外乎就是以上四個步驟;


在下一節裡,筆者將更仔細的說明這四個安裝流程,並讓大家對於安裝
Linux 有些基本的觀念。

3-2 磁碟分割與目錄規劃

在這一章節裡,筆者除了接續『3-1 安裝的概念』所說的安裝四個流程
之外,會在第二個流程 (切割硬碟、格式化硬碟) 介紹一些基礎的磁碟分割
以及目錄結構概念。

安裝 —第一個流程 :

在開始安裝之前,需要設定光碟開機;必須進入 BIOS 設定畫面,


把開機順序調整為『光碟優先』。設定完成後,系統會重新開機;這時直接
放入 Linux 安裝光碟,利用光碟開機,就可以進入 Linux 的安裝介面了。

- 18 -
安裝 —第二個流程 :

進入到 Linux 安裝介面後,首先需要設定一些相關的設定,例如:


環境語系設定、鍵盤配置等;這些都可以照著螢幕的提示,點選適當的選項
來完成。前置作業完成後,接下來會來到『切割硬碟、格式化硬碟』的這個
階段,這裡就要稍微小心囉!各位在安裝系統之前,一定要事先想好這台機
器要作什麼用途,這樣才能做好最完善的磁碟分割。筆者在這兒,會跟大家
講解一些基礎的 Linux 磁碟分割以及目錄結構概念。

在 Windows 底下,根據硬碟磁區 (partition) 的不同,磁碟代號的


名稱會像是『C、D、E』這樣的編排方式;但是在 Linux 底下,磁碟代號
的名稱,則又是另外一種完全不同的編排方式 —有別於『C、D、E』之類
的方式。

每塊主機板上可能至少兩個 IDE Controller,主要的叫作 IDE0


(Primary),次要的叫作 IDE1 (Secondary),而每一個接頭又會分成 Master
跟 Slave。在 Linux 底下,根據這些裝置排線的不同,系統給予的磁碟代稱
也會不同,筆者將它們整理如下表:

Linux 磁碟裝置的命名:

第一條排線 (IDE0) 的 master 接頭的


IDE0 hda (master)
硬碟裝置代稱為《hda》。
(Primary)
第一條排線 (IDE0) 的 slave 接頭的
hdb (slave)
硬碟裝置代稱為《hdb》。

第二條排線 (IDE1) 的 master 接頭的


IDE1 hdc (master)
硬碟裝置代稱為《hdc》。
(Secondary)
第二條排線 (IDE1) 的 slave 接頭的
hdd (slave)
硬碟裝置代稱為《hdb》。

由於一顆硬碟最多只能切四個『主要磁區』(Primary Partition),
因此通常我們會切一個『延伸磁區』(Extended Partition),接著在延伸磁區

- 19 -
切割『邏輯磁區』(Logical Partition)。在 Windows 下,不管您的硬碟是
『主要磁區』還是『邏輯磁區』,它的代稱依舊還是『C、D、E』;但是
在 Linux 底下,磁碟的命名方式則完全不同,筆者將在下表中舉例說明。

Linux 磁碟裝置命名範例與解說:

hda1 (master) 將《hda》切割成四個主要磁區 (Primary


IDE0 hda2 Partition)。因此隨著《hda》的後面,就
(Primary) hda3 會加上《磁區編號》(Partition Number)
hda4
hdb1 (slave) 將《hdb》切割成四個磁區;第四個磁區
hdb2 切成《延伸磁區》(Extended Partition)。
hdb3 因此第一個《邏輯磁區》(Logical
Partition) 的代稱就從《hdb5》開始。
hdb4 hdb5
(延伸磁區) hdb6

hdc (master) 這裡假設《hdc》是光碟機。


IDE1
hdd1 (slave) 將《hdd》切割成三個磁區;兩個《主要磁
(Secondary)
hdd2 區》、一個《延伸磁區》、兩個《邏輯磁區
》。於是硬碟代號會像是《hdd1》、《hd
hda3 hdb5 d2》、《hdd5》、《hdd6》。
(延伸磁區) hdb6

在 Linux 底下,磁碟的分割與裝置名稱對應如同上表所述;在這裡要
特別注意的有下列三點:

1. 一個硬碟『最多』只能切割『四個』主要磁區。
2. 若要讓磁區多過於四個,則必須建立一個『延伸磁區』。
3. 只要是 ”第一個”『邏輯磁區』其裝置編號均以『5』為起始值,
其他的邏輯磁區編號會依序遞增。

有了 Linux 磁碟分割與裝置名稱編號的概念後,各位在面對安裝介面
的『磁碟分割』程式時,就能夠妥善的處理分割事宜。

知道如何分割硬碟後,接著就要來思考『要如何規劃分割區』?
要能夠妥善的規劃分割區,首先要大略的了解『Linux 樹狀目錄結構圖』。

- 20 -
底下是一個 Linux 樹狀目錄結構之範例圖示。

Linux 樹狀目錄結構圖:

(圖示來源: 柏青哥的網站)

Linux 的目錄結構,主要是根據 FHS 標準規範來定義 (Filesystem


Hierarchy Standard) (http://www.pathname.com/fhs/)。

在進行磁碟分割的同時,安裝介面會提示您要設定磁區的『掛載目錄』
;這時候就必須先認識一下 Linux 底下幾個重要的目錄,才能夠做設定。

筆者在下表列整一些比較重要的系統目錄來為各位說明:

Linux 重要目錄說明:

/ 根目錄 (所有的檔案與內容都從根目錄為起始)

/boot 存放核心與開機程式檔案

/etc 存放主要系統設定檔

/home 使用者家目錄 (存放所有使用者的檔案)

/tmp 存放暫存資料

/root 超級使用者家目錄

/usr 存放系統大部分的資源與檔案

/var 存放經常變動的資料 (網路服務、資料庫、Mail..)

- 21 -
上表所述的目錄,除了『/etc』必須依附於『/』之上 (表示不能將
/etc 切割在 / 之外);其他的目錄都可以掛載於獨立的 partition 之上。

補充說明:

關於 Linux 目錄的說明,筆者在『4-2 Linux 目錄架構』章節


會有更多的解說。

一般而言,安裝 Linux 最少要有兩個 partition;其中一個磁區


要掛載為『/』,另外一個磁區必須格式化並設定為『swap』形式。

Swap 置換空間:

在 Linux 下必須建立一個磁區,格式化並設定為『swap』形式。
swap 是所謂的『交換區』或稱為『虛擬記憶體』;當實體記憶體 (Ram)
不敷使用時,就會將資料寫入 swap 磁區,將硬碟當作實體記憶體來使用。

在建立磁區與設定掛載目錄的同時,必須先規劃好這台機器的用途
(譬如:桌面應用、或者伺服器應用?) 不同的用途有不同的規劃方式。

舉例說明:

如果一台 Linux 主要是用來做『Web+Mail』服務,那麼比較妥善的


規劃,可以將『/home』—使用者家目錄 (存放所有使用者的檔案) 以及
『/var』—存放經常變動的資料 (網路服務、資料庫、Mail..),把這兩個
目錄掛載在獨立的 partition,並儘量給予較大的空間。另外還可以獨立
切割一個『/backup』(備份磁區),專門來存放 Server 備份的資料。

硬碟切割完成後,必須『格式化』才能使用。在 Windows 下,
檔案格式有 NTFS、FAT32 等;在 Linux 也有相關的檔案格式,常見的
例如:ext3、reiserfs、xfs 等。通常安裝介面的硬碟分割程式,大都會
自動幫您做『格式化』的動作;您可以自由選擇要格式化成哪種檔案格式。

對於要正式上線的網路伺服主機來說,做好妥善的磁碟規劃是必要的!

- 22 -
除了可避免因為『磁碟分割區不當配置』所引發的問題之外,對於主機的維
護與管理也是相當有益處哦!

主機的規劃與安裝前的認知:

『鳥哥的私房菜—Linux 主機的規劃』
— http://linux.vbird.org/linux_basic/0130designlinux.php

『鳥哥的私房菜—Linux 主機的規劃以 FC4 為例』


— http://linux.vbird.org/linux_basic/0156installfc4.php

『柏青哥的 SuSE Linux—安裝 Linux 前該有的認知』


— http://paching.myweb.hinet.net/lesson2.htm

安裝 —第三個流程 :

經過了上述『磁碟分割與格式化』的第二流程後,接下來的安裝過程就
非常輕鬆了。在大部分的 distribution 裡,各位只要需要手動勾選自己要裝
的套件與相關內容,選完後按下『確認鈕』(Next),安裝介面程式會自動的
將 Linux 作業系統檔案『複製』到您配置的硬碟磁區上 (掛載目錄中)。

系統檔案複製完成後,大部份的安裝程式會提示使用者安裝
『開機管理程式』(Boot Loader),較先進的安裝程式會自動幫您配置好
『多重開機』的設定 (讓您的 Linux 可以與 Windows 系統並存)。

安裝 —第四個流程 (完成) :

所有安裝步驟已經完成。在退出安裝介面程式後,系統將進行第一次
重新開機,並進入到 Linux 系統。

初次進入到 Linux 系統時,有些 distribution 會有相關的應用程式,


自動幫助您做一些初始環境的設定。接下來各位就可以盡情的享用 Linux
,讓 Linux 為您的生活帶來樂趣!

最後您會發現 —『原來安裝 Linux 居然這麼簡單啊!』

- 23 -
3-3 安裝 Debian GNU/Linux

在這份文件中,主要希望帶給各位基礎的 Linux Command Line


(命令列) 操作能力,講義的內容不涵括 GUI (X-window)。因此筆者認為
精簡的 Debian GNU/Linux (http://www.debian.org/),非常適用於
『Linux 文字命令列』的教學環境。加上 Debian 的 APT 系統,未來各位
在安裝軟體以及架設伺服器時,可以利用『apt-get install』就輕鬆搞定!

筆者在『3-2 安裝的流程』以文字敘述的方式介紹了 Linux 的安裝


過程,底下筆者以『Debian GNU/Linux』為例,親自將『安裝過程』截圖
下來。各位可參照下列圖示直接『按圖施工』,筆者就不多做補充囉!

Debian GNU/Linux 安裝與設定:

3-3-1 光碟開機後,輸入『linux26』安裝 2.6 版本的 Linux Kernel。

- 24 -
3-3-2 選擇『語系』以及『鍵盤配置』。

- 25 -
3-3-3 設定『主機名稱』以及『網域名稱』。

3-3-4 起始『磁碟分割程式』。

- 26 -
3-3-5 進行『磁碟分割作業』。

3-3-6 開始安裝『Debian Base System』(複製檔案至硬碟)。

- 27 -
3-3-7 安裝『開機管理程式』(Boot Loader)。

3-3-8 『安裝完成』退出光碟片,準備第一次『重新開機』。

3-3-9 開機後會看到『GRUB 開機管理程式』選擇進入新的系統。

- 28 -
3-3-10 進入『Base System 設定作業』,先設定『時區』。

3-3-11 設定『root』(系統管理者) 的密碼。

- 29 -
3-3-12 設定『一般使用者』帳號以及密碼。

3-3-13 設定『apt 工具』的『sources.list』(安裝來源)。

- 30 -
3-3-14 選擇要安裝的軟體,採用『網路安裝』方式。

- 31 -
3-3-15 設定『Exim v4』郵件伺服器。

- 32 -
3-3-16 『Base System 設定作業』已經完成,可以登入系統囉!

更多資源:

『Debian 大本營 —摩托學園』


— http://moto.debian.org.tw/

『Debian 新手安裝圖解教學』
— http://moto.debian.org.tw/viewtopic.php?t=4962

對於管理 Debian GNU/Linux 有相關問題,不妨直接參考:

『Debian 參考手冊』
— http://qref.sourceforge.net/

- 33 -
第 4 章 系統結構與目錄架構
4-1 Linux 系統結構

筆者在『第4章』要簡單介紹 Linux 的系統結構以及目錄架構。


在開始使用 Linux 之前,若能了解它的基礎結構,相信在日後的練習與
操作上,能有更深刻的體會。

每一台 PC 都有 CPU、記憶體、硬碟、PCI 介面卡等,如果沒有在


硬碟上安裝『作業系統』,那麼光有硬體是完全無法做任何事情的!

『作業系統』它是安裝在『硬碟』上的一套『完整的大程式』。
這套『大程式』的用途,就是用來『控制』電腦硬體,讓它來幫您做事!
它能幫助各位『竭盡所能』的榨乾硬體資源與功能。

Windows 與 Linux 兩套系統在『檔案目錄』結構上有什麼不同?


在 Windows 當中,磁碟分割是由『C:\、D:\』這樣的順序編排而成;在
Linux 底下則是統一由『/ (root)』作為系統的『根目錄』,系統內所有的
目錄都依附在『/ (root)』底下。假使不同的硬碟或分割區 (Partition),
也一樣都依附在『/ (root)』底下,透過『mount (掛載)』的方式,將它們
掛載起來使用。

以下圖例用來表示電腦硬體與 Linux 之間的關係。

電腦硬體與 Linux 作業系統彼此的 關係圖:


作業系統
電腦 Windows Applications
Windows
系統架構
C:\ Server X-window
CPU D:\ Apps Apps
RAM
Linux OS Utilities / Applications
˙˙˙˙

HDD / Kernel
符合 FHS 標準規範 Hardware

- 34 -
Linux 系統結構 圖:

Applications 這裡又可以區分成專門作為『網路服務』
的伺服器程式以及專為『桌面應用』的
Server X-window X-window 程式等;還有不隸屬上述兩種
Apps Apps 的『其他程式』。

OS Utilities / Applications 系統層級的應用程式與管理工具


Kernel 作業系統的核心
Hardware 電腦硬體

簡單來說,Linux 作業系統由以下幾個部分所組成:

1. Linux Kernel (核心)


2. OS Utilities / Applications (系統層級的應用程式或管理工具)
3. Applications (一般應用程式)
a. Server Applications (伺服應用軟體)
b. X-Window Applications (桌面視窗應用軟體)
c. Other Applications (不屬於上述兩種的『其他軟體』)

以上是針對『Linux 系統結構』所做的概括性描述;Linux 系統的


結構除了上述的以外,還有其他更細節的內容,譬如:Libraries (函示庫)
等更多的相關細節。

補充資源:

『UNIX 架構簡圖』
— http://kalug.linux.org.tw/~lloyd/LLoyd_Hand_Book/book/unix-intronal.html

有了上述的概念後,各位可以發現 Linux 除了可以安分守己的當


Server 以外,也可以把其他的應用程式軟體 (包含 X-window Application)
通通裝進來。這樣既可以玩 Desktop 又可以架設 Server 呢!一台機器兩種
用途,多棒阿!

- 35 -
4-2 Linux 目錄架構

Linux 的目錄結構,主要是根據 FHS (Filesystem Hierarchy


Standard) 規範標準 (http://www.pathname.com/fhs/)。筆者參照
FHS 規範,在下面表格中,列整系統中常見的目錄並簡略說明。

系統中常見的目錄與 說明:

/ 根目錄 (萬物的起源)
/bin 存放基本的執行檔,可供所有使用者使用
/boot 存放核心與開機程式檔案
/dev 裝置檔案目錄
/etc 存放主要系統設定檔
/home 使用者家目錄 (存放所有使用者的檔案)
/lib 函式庫目錄
/media/* 可卸除式媒體的掛載目錄
/mnt 暫時性儲存媒體或可提供掛載的檔案系統之掛載目錄
/opt 作為其他應用程式存放檔案與資料
/proc 虛擬的檔案系統目錄,存放系統的相關資訊
/root 超級使用者家目錄
/sbin 存放系統或超級使用者可使用的執行檔
/srv 存放一些網路服務 (Service) 的檔案與資料
/sys 存放系統相關資訊
/tmp 存放暫存檔案
/usr 存放系統大部分的資源與檔案
/var 存放經常變動的資料 (網路服務、資料庫、Mail..)

- 36 -
在 Linux 系統中,所有的目錄都是掛載於 / (根目錄) 底下,我們可以
使用『cd』這個指令來切換目錄。切換目錄的方式,有兩種:一種是使用
『絕對路徑』,另外一種是使用『相對路徑』,關於絕對路徑與相對路徑的
說明,筆者在下方來說明。

• 『絕對路徑』 —
只要路徑的表示是以『/』作為起始開頭,則屬於絕對路徑表示法。

cyj@debian:~$ cd / (到根目錄)
cyj@debian:/$ cd /home/cyj/ (到 home 底下的 cyj 目錄)
cyj@debian:~$ cd /etc/ (到 etc 目錄)
cyj@debian:/etc$ cd /usr/share/ (到 usr 底下的 share 目錄)

• 『相對路性』 —
只要路徑的表示,”不以”『/』作為開頭,則屬於相對路徑表示法。

cyj@debian:/usr/share$ cd ../../ (從 /usr/share 目錄往上走兩層)


cyj@debian:/$ cd home/cyj/ (在 / 中切換到 home 底下的 cyj 目錄)
cyj@debian:~$ cd ../../tmp/ (在 cyj 目錄中往上走兩層到 tmp 目錄)

提到『相對路徑』表示方法,在此有四個符號,大家一定要熟悉唷!

• 『.』(點) 符號: 代表『現行目錄 (current directory)』的意思。


• 『..』(點點) 符號: 代表『上一層目錄 (父目錄)』的意思。
• 『~』(波浪) 符號: 代表『使用者家目錄 (/home/$USER)』的意思。
• 『–』(連結) 符號: 代表『上一個使用目錄 (上一頁)』的意思。

筆者在下面一樣舉些範例,讓各位可以清楚了解這四個符號的意義。

『.』(點) 符號應用例:

cyj@debian:~$ cd . (進入現行目錄)
cyj@debian:~$ pwd (使用 pwd 指令查看現在所在目錄位置)
/home/cyj (一樣在家目錄中,沒有更換位置)

- 37 -
『..』(點點) 符號應用例 :

cyj@debian:~$ cd .. (從家目錄,到『上一層』目錄,即為 /home )


cyj@debian:/home$ cd .. (從 home 目錄,再往『上一層』移動)
cyj@debian:/$ pwd (查看所在目錄位置 —回到了根目錄 / )

『~』(波浪) 符號應用例:

cyj@debian:/$ cd ~ (回到自己的家目錄 /home/cyj )


cyj@debian:~$ pwd
/home/cyj
cyj@debian:~$ cd ~denny (進入 denny 的家目錄中)
cyj@debian:/home/denny$ cd ~yenjinc (進入 yenjinc 的家目錄中)
cyj@debian:/home/yenjinc$ cd ( cd 與 cd ~ 都是回到自己的家目錄中)

『–』(連結) 符號應用例:

cyj@debian:~$ cd ~yenjinc (進入 yenjinc 的家目錄中)


cyj@debian:/home/yenjinc$ cd ( cd 與 cd ~ 都是回到自己的家目錄中)
cyj@debian:~$ cd - (回到『上一個』使用的目錄)
/home/yenjinc (於是又回到 yenjinc 的家目錄)
cyj@debian:/home/yenjinc$ cd - (又再回到『上一個』使用的目錄)
/home/cyj
cyj@debian:~$ cd - (再一次!)
/home/yenjinc (於是又回到 yenjinc 的家目錄)

這個『cd –』,比較像是『上一頁』的意思!例如各位在瀏覽網頁時,
時常會按下『回上一頁』的按鈕一樣;這裡的『cd –』可以讓您從『當前
目錄』回到『上一個』使用過的目錄。 (建議大家,邊看講義時,可以一邊
實做來個現學現賣哦! )

在這一章節裡,筆者介紹了『Linux 目錄架構』以及『絕對路徑/
相對路徑』的基礎概念;假使各位對 FHS 的細節有興趣,不妨參考下列
資源。

- 38 -
補充資源:

『Filesystem Hierarchy Standard (FHS)』


— http://www.pathname.com/fhs/

『Filesystem Hierarchy Standard (FHS) 2.3 』


— http://www.pathname.com/fhs/pub/fhs-2.3.html

『認識 Linux 的目錄配置 (FHS)』


— http://linux.vbird.org/linux_basic/0210filepermission.php#dir

- 39 -
Linux 基礎使用

第 5 章 上機使用 Linux
5-1 登入的方式

在 Linux 系統上有兩種主要的登入方式:

第一種:親自走到主機面前,拿起鍵盤,輸入帳號密碼。這是最基本
的登入方法了。一般而言,預設可登入的終端機 (Virtual Console)
有七個,分別是從 『tty1』到『tty7』(tty7 通常是作為 X-window
的使用)。如果各位想要在虛擬終端機之間切換,只要在鍵盤上按下
『Ctrl』+『Alt』+『F2』(三鍵一起按),就可以切換到『第二個虛擬
終端機 (tty2)』;以此類推,若按下『Ctrl』+『Alt』+『F1 到 F7』
就可以讓您從 tty1 切換到 tty7 囉!

第二種:在 Linux (& UNIX-Like) 系統上,有一個特點是:不論您


在何時何地,都可以透過網路,直接登入到主機來使用。從下面的
『遠端登入示意圖』可以看到,在 Linux主機上,透過『telnetd』
或者『sshd』的服務,來啟動『遠端登入』的功能。

遠端登入示意圖
虛擬終端機
Linux 主機 (Virtual Console)
鍵盤 (Keyboard)
提供的服務 Applications VT 1
VT 2
HTTP
Server X-window telnetd / sshd VT 3
FTP
MAIL Apps Apps VT 4
… VT 5
OS Utilities / Applications VT 6
Kernel VT 7
透過網路連結的電腦
Hardware (telnet client / ssh client)

- 40 -
如果各位的 Linux 是安裝在外地的電腦上,那就必須要『遠端登入』
才能在遠端的主機上進行練習與操作。假使您目前已經在 Linux 系統下,
使用系統的 ssh 或 telnet 指令就可以直接登入到遠端的機器啦!

若各位在 Windows 下想要登入到遠端的 Linux 主機,有兩種方式:


第一種,打開『命令提示字元 (cmd)』,使用 windows 內建的 telnet
命令來登入。第二種,使用遠端登入軟體『PuTTY』(http://www.putty.nl/
download.html),或者 PieTTY (http://ntu.csie.org/~piaip/pietty/)。

5-2 登入與登出

登入時,必須填入帳號跟密碼,以下遠端登入的示範例子:

筆者使用 ssh 指令,以 yenjinc 帳號登入到 yenjinc.info 的遠端主機。


cyj@X40:~> ssh yenjinc@yenjinc.info
Password: (注意喔!這裡打密碼並不會出現 ******* 號)
yenjinc@~$ (到這裡,就算是登入成功啦!)

要登出時,只要打個 logout 指令就好了。


yenjinc@~$ logout
Connection to yenjinc.info closed. (已經登出囉!)

另外,在第一次登入系統後,最好先更改自己的登入密碼,以免系統預
設開給您的密碼太過於簡單,而導致系統被惡意人士入侵。更改密碼的指令
是 passwd,使用方式在下面介紹。

yenjinc@~$ passwd (直接打 passwd 就可以更改密碼了)


Changing password for yenjinc
(current) UNIX password: (輸入目前的密碼)
Enter new UNIX password: (輸入新的密碼)
Retype new UNIX password: (再次輸入新的密碼,核對是否輸入正確)
passwd: password updated successfully (密碼更改成功)

- 41 -
5-3 登入後的環境

我們登入 Linux 系統後,會進入到終端機的畫面,這個畫面就像是


來到了早期的 DOS 系統一般 (閃爍的游標,等待使用者輸入命令)。

這一個操作環境稱為『Shell』(Linux 預設使用 Bash Shell)。


使用者 Login 之後,就會來到 Shell。當使用者下達指令時,Shell 會將
指令轉送給作業系統,並要求作業系統幫我們做事情。等到工作完成後,
作業系統也會透過 Shell,將執行完成的結果再傳回給使用者。下面這張
圖示用來表示 Shell 的概念。

Shell 環境示意圖
使用者登入
(Login)

Shell (Bash)
作業系統
(Linux)

Shell 的提示畫面類似這樣:

yenjinc @ riemann : ~ $

簡單的說,『yenjinc@riemann:~$』,所代表的意義是:
• [ yenjinc (姓名)]
• [ @ (在)]
• [ riemann (主機名稱)]
• [ : (分隔符號)]
• [ ~ (當前所在目錄)]
• [ $ (提示字元)]

- 42 -
筆者在下列表格為大家解說相關細節:

表示『使用者名稱』(username) 。使用者 yenjinc 登入到


yenjinc (姓名) 系統後,在畫面的第一欄位,就會顯示『yenjinc』。

@ (在) 『At (在)』的意思。(如同 E-mail 中,『小老鼠』的地位。)

表示『主機名稱』(hostname)。譬如筆者登入到 riemann
riemann (主機名稱) 主機,所以在畫面第三欄位,就會顯示為『riemann』。

: (分隔符號) 只是單純的『分隔符號』,沒有其他的意思。

表示『當前所在目錄』(current directory)。上述這個例子
~ (當前所在目錄) 『~』代表的是『家目錄』。 預設的情況下,使用者登入後
,會進入『家目錄』(自己的家),因此若您在其他目錄時,
這個欄位就會顯示『相對應』的目錄位置。譬如:目前正在
/home/cyj 目錄中,這個欄位就會顯示『/home/cyj』。

在 Linux (UNIX-Like) 的世界中,有三種人。


$ (提示字元) • 『普通人』(user)
• 『守護神』(daemon user)
• 『天神』(root、super user)
普通人就是一般的使用者,一般使用者登入時,這個提示字元
符號即為『$』。
守護神是介於一般使用者以及天神之間,它的職責是幫忙天神
(root) 管理系統的 daemon。這些 daemon user 多半只
有控制 daemon (常駐服務) 的權限,不具有 Login 的權限,
所以不會有提示字元。
天神顧名思義就是『天底下什麼事它都能做』—這就是 root
。root 在系統當中,擁有最大的管理權以及掌控權,它可以
做任何它想要做的事情。root 的提示字元符號為『#』。

我們來看下面提示字元範例:

yenjinc @ riemann : ~ $ ( yenjinc 登入到 riemann 主機,正在家目錄。)


yenjinc @ riemann : /boot $ ( yenjinc 登入到 riemann 主機,正在 /boot 目錄。)
root @ riemann : ~ # ( root 登入到 riemann 主機,正在家目錄。)
root @ riemann : /boot # ( root 登入到 riemann 主機,正在 /boot 目錄。)

- 43 -
5-4 切換使用者

『一般使用者』跟『系統管理者』之間的差異,從『提示字元』符號的
不同,以至於『控管系統』的權限也大不相同。接著筆者要介紹 su、sudo
的應用,它們可以讓您 (一般使用者) 在不用登出系統的狀況下『變身』為
root,進而處理一些系統管理的工作。

使用『man』查看一下 『su』的說 明 :

cyj@debian:~$ man su (看 su 的 manpage 使用說明)

以下筆者將較為重要的部份節錄出來

NAME
su - Change user ID or become super-user

SYNOPSIS
su [OPTS] [-] [username [ARGS]]

OPTIONS
- make this a login shell

-c, --commmand=<command>
pass command to the invoked shell using its -c option

-m, -p, --preserve-environment


do not reset environment variables, and keep the same shell

su 指令可以讓您在不登出系統的狀態中,切換成為其他的使用者,
或者切換成為超級使用者 (root),進行系統管理的工作。以下是針對 su
指令基本的使用範例介紹。

使用『su』切換使 用者:

cyj@debian:~$ whoami (使用 whoami 查看,得知目前使用者為 cyj)


cyj

- 44 -
cyj@debian:~$ su yenjinc (使用 su 將使用者切換為 yenjinc )
Password: (輸入 yenjinc 的密碼)
yenjinc@debian:/home/cyj$ whoami (已切換為 yenjinc )
yenjinc
yenjinc@debian:/home/cyj$ su (使用 su 切換為超級使用者 root )
Password: (輸入 root 的密碼)
debian:/home/cyj# whoami (使用 whoami 驗證一下)
root (已經切換為 root 了)

使用『exit』可以離開 su 切換後的環境

debian:/home/cyj# exit (離開 root 身份)


exit
yenjinc@debian:/home/cyj$ exit (離開 yenjinc 身份)
exit
cyj@debian:~$ whoami (已回到了 cyj 身份)
cyj

使用『su – 』以 Login Shell 方式來 切換:

cyj@debian:~$ echo $MAIL (以 echo 來顯示 $MAIL 變數內容)


/var/mail/cyj (在此顯示為 cyj 的信箱路徑)
cyj@debian:~$ su (使用 su 切換為 root )
Password:
debian:/home/cyj# echo $MAIL (再次查看 $MAIL 變數內容)
/var/mail/cyj (為何切換成 root 後依然顯示 cyj 的信箱位置?)
(切換成 root 後,應該顯示 root 的信箱不是嗎?)

debian:/home/cyj# exit (切換為 cyj 的身份)


exit
cyj@debian:~$ su - (使用 su – 以 login shell 方式切換)
Password:
debian:~# echo $MAIL (查看 $MAIL 變數內容)
/var/mail/root (這時已經顯示為 root 的信箱位置了)

這就是『su』與『su – 』之間的差異。在 su 之後加上 – (hyphen)


,將以『Login Shell』方式切換使用者,表示 Shell 會讀入所有與該使用者
相關的環境變數。(關於 Bash Shell 相關詳細請參考『』章節)

- 45 -
以上都是介紹如何使用 su 來切換使用者,接著下面要介紹 su 最好用
的一項功能—『不登入為 root,而使用 root 身份來執行命令!』這功能
其實等同於『sudo』的功能,在我們介紹 sudo 指令之前,先來看一下
『su –c 』的應用範例。

使用『su –c 』以 root 身份來執行 命令:

cyj@debian:~$ /sbin/shutdown -h now (執行 /sbin/shutdown 來關機)


shutdown: you must be root to do that! (必須以 root 身份才能執行!)

cyj@debian:~$ su -c "/sbin/shutdown -h now" (使用 su –c 來執行命令)


Password: (輸入 root 密碼)
開始關機…
Broadcast message from root (tty1) (Mon Feb 5 16:38:47 2007):
The system is going down for system halt NOW!
INIT: Switching to runlevel: 0
INIT: Sending processes the TERM signal

接著筆者要介紹 sudo 這個指令的使用。如同上述,sudo 它的功能跟


su –c 是類似的—『不登入為 root,而使用 root 身份來執行命令!』

安裝『sudo』工具:

sudo 是一套工具程式,在預設的狀態下,系統可能沒有安裝。
在 Debian GNU/Linux 可以使用 apt-get install 指令來安裝。
(關於 apt-get install 的使用方法可參考『』章節)

cyj@debian:~$ su -c "apt-get install sudo" (以 root 身份執行 apt-get install )


Password: (輸入 root 密碼,安裝 sudo 工具 )
Reading Package Lists... Done
Building Dependency Tree... Done
sudo is already the newest version. (筆者系統已經安裝完畢)
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
cyj@debian:~$

安裝完成後,要執行 visudo 來設定 /etc/sudoers 的人員名單。

- 46 -
使用『visudo』來設 定可使用 sudo 工具的人員名單:

cyj@debian:~$ su -c "visudo" (以 root 身份執行 visudo)


Password: (輸入 root 密碼)

進入 visudo 的編輯畫面。(關於 vi 編輯器的用法,可參考『』章節)

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
# See the man page for details on how to write a sudoers file.
#

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification


root ALL=(ALL) ALL
cyj ALL=(ALL) ALL (←加入這一串,表示 cyj 使用者擁有執行 sudo 權限)

儲存離開後,即大功告成。

當使用者加入到 /etc/sudoers (即 visudo 時的編輯檔案),即可利用


sudo 來執行具有 root 權限的指令。sudo 本身即是具有 root 權限的工具
,它讓一般使用者 (有列在 /etc/sudoers 名單中) 可用自己的密碼 (不需要
root 密碼) 來執行 root 所授權的指令與動作。

『sudo』使 用範例:

yenjinc@debian:~$ sudo /sbin/reboot ( 使用者 yenjinc 使用 sudo 執行 reboot)


yenjinc is not in the sudoers file. This incident will be reported.
( yenjinc 並未在 sudoers 名單中)
(所以無法使用 sudo 執行相關指令)
yenjinc@debian:~$ su - cyj (切換成 cyj 使用者;它有在 sudoers 中。)
Password: (輸入 cyj 的密碼)

- 47 -
cyj@debian:~$ /sbin/reboot (以 cyj 身份執行 /sbin/reboot 重開機)
reboot: must be superuser. (系統告知:必須以 root 身份才能執行)
cyj@debian:~$ sudo /sbin/reboot (使用 sudo 來執行 /sbin/reboot 指令)
Password: (輸入 cyj 自己的密碼,非 root 密碼)

系統進行 reboot 重關機


Broadcast message from root (tty1) (Mon Feb 5 21:08:43 2007):
The system is going down for reboot NOW!
INIT: Switching to runlevel: 6
INIT: Sending processes the TERM signal

以上是 su 以及 sudo 的基本介紹,更詳細的資源不妨參考以下。

補充資源:

『鳥哥的 Linux 私房菜 – 使用者身份切換 (su、sudo)』


— http://linux.vbird.org/linux_basic/0410accountmanager.php#userswitch

『Sudo Main Page』


— http://www.gratisoft.us/sudo/

筆者提醒各位一定要養成『不要使用 root 登入系統』的好習慣。


在系統安裝完成後,就不要在使用 root 帳號了。若需要使用 root 權限
來做系統維護的工作時,可以使用 su –c 或者 sudo 替代方案。養成這樣
的好習慣,對於系統安全是有正面的幫助哦!

5-5 開機與關機

在 Linux 系統下,首先要學的第一件事情就是要知道『如何開機與
關機』。開機的部份只要將主機的 power 電源打開,在 Boot Loader 選擇
進入 Linux 系統,即完成開機動作。若要重新開機或關機時,切勿直接按下
主機的 reset 按鈕或者 power 按鈕來切斷電源,這會讓 Linux 系統受損。

- 48 -
Linux 就如同其他的作業系統一般,在關機或重開機時,需要由使用者下達
『關機指令』給系統,它才會遵照標準程序來進行關機或重新開機,這對於
硬碟以及系統才不會造成損害。

在 Linux 中,關機與重新開機的指令如下所列,筆者將一一介紹。
1. shutdown
2. reboot
3. halt
4. poweroff

使用『man』查看一下 『shutdown』的說明:

cyj@debian:~$ man shutdown (看 shutdown 的 manpage 使用說明)

以下筆者將較為重要的部份節錄出來

NAME
shutdown - bring the system down

SYNOPSIS
/sbin/shutdown [-t sec] [-arkhncfFHP] time [warning-message]

OPTIONS

-t sec Tell init(8) to wait sec seconds between sending processes the
warning and the kill signal, before changing to another run-
level.

-k Don't really shutdown; only send the warning messages to every-


body.

-r Reboot after shutdown.

-h Halt or poweroff after shutdown.

『shutdown』重新開機 範例:

cyj@debian:~$ sudo shutdown -r now (立即『重開機』)

- 49 -
cyj@debian:~$ sudo shutdown -r +10 "System will reboot"
(系統在 10 分鐘後會『重開機』,並顯示 ”System will reboot” 訊息)
cyj@debian:~$ sudo reboot (reboot 的功能等同於 shutdown –r now)

『shutdown』關機範例 :

cyj@debian:~$ sudo shutdown -h now (立即關機)


cyj@debian:~$ sudo shutdown -h +10 "System will halt"
(系統在 10 分鐘後會『關機』,並顯示 ”System will halt” 訊息)
cyj@debian:~$ sudo halt –p (halt –p 功能等同於 shutdown –h now)
cyj@debian:~$ sudo poweroff (poweroff 功能等同於 halt –p )

『shutdown』傳送『警 告訊息』範 例:

cyj@debian:~$ sudo shutdown -k now "System will halt"


(系統發出 "System will halt" 的警告訊息,但不會真的關機。)

以上指令都必須擁有 root 權限才能執行。筆者在此範例是以 cyj


一般使用者來進行系統關機作業,使用的是 sudo 替代方案。養成使用
sudo 來進行系統維護是良好的習慣哦! (請參考『5-4 切換使用者』章節)

以上是 Linux 關機與重開機的基本介紹,更多資源不妨參考下列。

補充資源:

『鳥哥的 Linux 私房菜 – 開機、關機』


— http://linux.vbird.org/linux_basic/0160startlinux.php#shutdown

『shutdown manual page』


— $ man shutdown

- 50 -
第 6 章 認識 Bash Shell
6-1 基礎概念

我們登入 Linux 系統後,會進入到終端機的畫面,這個畫面就像是


來到了早期的 DOS 系統一般 (閃爍的游標,等待使用者輸入命令)。

這一個操作環境稱為『Shell』(Linux 預設使用 Bash Shell)。


使用者 Login 之後,就會來到 Shell。當使用者下達指令時,Shell 會將
指令轉送給作業系統,並要求作業系統幫我們做事情。等到工作完成後,
作業系統也會透過 Shell,將執行完成的結果再傳回給使用者。下面這張
圖示用來表示 Shell 的概念。

Shell 環境示意圖
使用者登入
(Login)

Shell (Bash)
作業系統
(Linux)

Shell 的提示畫面類似這樣:

yenjinc@debian:~$

我們可以直接在 Shell 提示畫面敲入 Linux / UNIX 指令,讓 Shell 來


執行相關的工作。下達指令的方式如下所示:

yenjinc@debian:~$ command [-options] parameter1 parameter2


(指令) [選項] (參數一) (參數二)

- 51 -
『指令下達』範例:

筆者在此以簡單的一些指令作為介紹
cyj@debian:~$ pwd (使用 pwd 指令查看所在位置)
/home/cyj
cyj@debian:~$ cd /tmp/ (使用 cd 指令,進入 /tmp/ 目錄)
( cd [←指令] /tmp/ [←參數] )
cyj@debian:/tmp$ ls (使用 ls 指令查看目錄內容)
cyj@debian:/tmp$ ls -a (加上 –a 選項,查看隱藏檔內容)
. .. .ICE-unix .X11-unix ( ls [←指令] –a [←選項] )
cyj@debian:/tmp$ touch file1 file2 file3 (使用 touch 指令建立三個檔案)
( touch [←指令] file* [←均為參數] )
cyj@debian:/tmp$ ls file* (使用 ls 顯示所有 file* 內容)
file1 file2 file3 ( ls [←指令] file* [←參數] *為萬用字元)
cyj@debian:/tmp$ rm * (使用 rm 指令刪除所有資料)
( rm [←指令] * [←參數] *為萬用字元)
cyj@debian:/tmp$ ls -a ( ls [←指令] –a [←選項] )
. .. .ICE-unix .X11-unix (所有 file* 相關檔案已經刪除)

[指令]、[選項] 以及 [參數] 之間都要以 [空格] 做分隔。


( 萬用字元的解說可參考『』章節)

在 Shell 底下還有兩個相當重要的功能要介紹給大家:

1. 命令編修與歷史命令 (history):
Bash Shell 有一個功能,它能紀錄您先前使用過的指令紀錄
(history)。在提示字元畫面,只要按下鍵盤的 ↑、↓ 按鍵,
就能在先前已經使用過的指令間相互切換。關於 history
指令的介紹,筆者在後面會做說明。

2. 命令與檔案補全 ( [TAB] ):
使用 Bash Shell 一定要記住一個按鍵,這個按鍵非常好用!
它就是 [TAB] 鍵 (Q的左邊)。當您在輸入指令時,按一下
[TAB] 鍵,Shell 會自動幫您補齊指令名稱。如果按一下沒有
作用時,這時候連按兩下時,Shell 會自動將名稱開頭符合的
指令統統列示出來。

- 52 -
[TAB] 鍵除了作為命令的自動補齊之外,還可以用於『檔案補全』。
也就是說,當您在輸入一串很長的路徑時 (或檔案名稱),按下 [TAB] 鍵後,
Shell 會自動將檔名或路徑名稱補全。

小道透漏:

在 Bash 下還有許多好用的組合命令,筆者在下方介紹。
命令補全
[TAB]
[Ctrl]+[i] (與 [TAB] 相同的作用)

移動游標
[Ctrl]+a (將游標移動到最前面)
[Ctrl]+e (將游標移動到最末端)

清除畫面
[Ctrl]+l (清除 Shell 畫面)
[Ctrl]+u (清除 Shell 當列的命令)
[Ctrl]+y (復原已清除的當列命令)

中斷命令
[Ctrl]+c (中斷當前命令)
[Ctrl]+d (EOF字符,於 Shell 底下使用等同於 logout )

Bash Shell 它能紀錄您先前使用過的指令紀錄 (history)。在提示字元


畫面,只要按下鍵盤的 ↑、↓ 按鍵,就能在已經使用過的指令間相互切換。
除此之外,系統有個 history 指令,能讓我們可以更善用歷史紀錄來做更多
有效率的命令操作哦!下面是 history 指令的使用介紹。

『history』指令 範例:

輸入 history 會顯示出目前已經使用過的歷史命令紀錄
cyj@debian:~$ history
1 ls -l
2 rm test2
3 touch tmp1
4 history

- 53 -
可使用『!』(驚嘆號) 來呼叫先前已經使用過的歷史命令
cyj@debian:~$ !2 (呼叫 history 2 的歷史命令,即 rm test2 )
cyj@debian:~$ !to (呼叫以 to 為開頭的歷史命令,即 touch tmp1 )
cyj@debian:~$ !! (執行上一個歷史命令,即為 !to )

6-2 相對路徑與絕對路徑

在 Linux 系統中,所有的目錄都是掛載於 / (根目錄) 底下,我們可以


使用『cd』這個指令來切換目錄。切換目錄的方式,有兩種:一種是使用
『絕對路徑』,另外一種是使用『相對路徑』,關於絕對路徑與相對路徑的
說明,筆者在下方來說明。

• 『絕對路徑』 —
只要路徑的表示是以『/』作為起始開頭,則屬於絕對路徑表示法。

cyj@debian:~$ cd / (到根目錄)
cyj@debian:/$ cd /home/cyj/ (到 home 底下的 cyj 目錄)
cyj@debian:~$ cd /etc/ (到 etc 目錄)
cyj@debian:/etc$ cd /usr/share/ (到 usr 底下的 share 目錄)

• 『相對路性』 —
只要路徑的表示,”不以”『/』作為開頭,則屬於相對路徑表示法。

cyj@debian:/usr/share$ cd ../../ (從 /usr/share 目錄往上走兩層)


cyj@debian:/$ cd home/cyj/ (在 / 中切換到 home 底下的 cyj 目錄)
cyj@debian:~$ cd ../../tmp/ (在 cyj 目錄中往上走兩層到 tmp 目錄)

提到『相對路徑』,在此有四個符號,大家也稍微認識一下:

- 54 -
• 『.』(點) 符號: 代表『現行目錄 (current directory)』的意思。
• 『..』(點點) 符號: 代表『上一層目錄 (父目錄)』的意思。
• 『~』(波浪) 符號: 代表『使用者家目錄 (/home/$USER)』的意思。
• 『–』(連結) 符號: 代表『上一個使用目錄 (上一頁)』的意思。

筆者在下面一樣舉些範例,讓各位可以清楚了解這四個符號的意義。

『.』(點) 符號應用例:

cyj@debian:~$ cd . (進入現行目錄)
cyj@debian:~$ pwd (使用 pwd 指令查看現在所在目錄位置)
/home/cyj (一樣在家目錄中,沒有更換位置)

『..』(點點) 符號應用例 :

cyj@debian:~$ cd .. (從家目錄,到『上一層』目錄,即為 /home )


cyj@debian:/home$ cd .. (從 home 目錄,再往『上一層』移動)
cyj@debian:/$ pwd (查看所在目錄位置 —回到了根目錄 / )

『~』(波浪) 符號應用例:

cyj@debian:/$ cd ~ (回到自己的家目錄 /home/cyj )


cyj@debian:~$ pwd
/home/cyj
cyj@debian:~$ cd ~denny (進入 denny 的家目錄中)
cyj@debian:/home/denny$ cd ~yenjinc (進入 yenjinc 的家目錄中)
cyj@debian:/home/yenjinc$ cd ( cd 與 cd ~ 都是回到自己的家目錄中)

『–』(連結) 符號應用例:

cyj@debian:~$ cd ~yenjinc (進入 yenjinc 的家目錄中)


cyj@debian:/home/yenjinc$ cd ( cd 與 cd ~ 都是回到自己的家目錄中)

- 55 -
cyj@debian:~$ cd - (回到『上一個』使用的目錄)
/home/yenjinc (於是又回到 yenjinc 的家目錄)
cyj@debian:/home/yenjinc$ cd - (又再回到『上一個』使用的目錄)
/home/cyj
cyj@debian:~$ cd - (再一次!)
/home/yenjinc (於是又回到 yenjinc 的家目錄)

這個『cd –』,比較像是『上一頁』的意思!例如各位在瀏覽網頁時,
時常會按下『回上一頁』的按鈕一樣;這裡的『cd –』可以讓您從『當前
目錄』回到『上一個』使用過的目錄。 (建議大家,邊看講義時,可以一邊
實做來個現學現賣哦! )

6-3 資料流重導向

『資料流重導向』的使用,在 Linux / UNIX 系統中是相當重要的。


簡單的說,資料流重導向 (redirection) 的功用是,它能夠將指令輸出
的結果『重新導向』到別的地方。它也能夠將『別的地方』的檔案內容
『重新導向』到指令上。資料流重導向總共分成三種類型:Standard input
、Standard output 以及 Standard error。各位可從下列簡圖來認識它的
運作模式。
將指令執行結果送到 Shell 畫面

終端顯示器
$ Command (指令)
(Shell 畫面)

將檔案內容 Standard input


(資料) 傳給
Command 正確的輸出 錯誤的輸出
(指令)
Files (例如: 指令 (例如: 指令
(檔案內容) 執行後的正 執行後的錯
確結果) 誤訊息)

Standard output Standard error

- 56 -
指令執行過程的資料傳輸情況:

(圖示來源:鳥哥的私房菜)

資料流重導向總共分成三種類型:Standard input、Standard
output 以及 Standard error。它們在 Shell 底下都有各自對應的符號:

1. 標準輸入 Standard input:代碼為 0,符號為 < 或 <<。


2. 標準輸出 Standard output:代碼為 1,符號為 > 或 >>。
3. 標準錯誤輸出 Standard error:代碼為 2,符號為 2> 或 2>>。

以下是範例說明。

標準輸出『Standard output』應用 範例:

cyj@debian:~$ echo "Test" > test.txt (使用 echo 輸出 “TEST” 轉向到 test.txt )
cyj@debian:~$ cat test.txt (查看一下 test.txt 內容)
Test (剛才 “標準輸出” 的結果已正確寫入)
cyj@debian:~$ echo "Test Test" >> test.txt (使用 >> 符號,將輸出累加到 test.txt)
cyj@debian:~$ cat test.txt (查看一下 test.txt 內容)
Test (← 原始檔案的內容不會被清除)
Test Test ( >> 符號表示將輸出 “累加” 至檔案)
cyj@debian:~$ > test.txt (不執行任何指令;直接將結果輸出)
cyj@debian:~$ cat test.txt (查看一下 test.txt,檔案已被清空)
cyj@debian:~$ cat > test.txt (將 cat 資料 “標準輸出” )
12345 (← cat 會等待使用者敲入資料)
<EOF> (← 敲入的資料直接寫入 test.txt)
(按下 Ctrl+d 中斷 —表示<EOF>字符)
cyj@debian:~$ cat test.txt (查看一下 test.txt 內容)
12345 (← 正確無誤!)

- 57 -
標準輸入『Standard input』應用範 例:

cyj@debian:~$ echo 'Hello! Yenjinc!' > file (使用 > 將 ‘Hello! Yenjinc!’ 寫入 file)
cyj@debian:~$ cat file (檢查 file 內容)
Hello! Yenjinc! (← 正確無誤)
cyj@debian:~$ mail -s "Hi" yenjinc < file (使用 mail 指令寫信給 yenjinc)
(-s 設定 title ) (信件內容以 file 標準輸入)
cyj@debian:~$ su - yenjinc (使用 su – 指令切換身份為 yenjinc)
Password: (← 輸入 yenjinc 的密碼)

yenjinc@debian:~$ mail (已經切換為 yenjinc,並查看 mail)


Mail version 8.1.2 01/15/2001. Type ? for help.
"/var/mail/yenjinc": 1 messages 1 new
>N 1 cyj@localhost.loc Tue Feb 06 17:01 15/531 Hi (收到 “Hi” 信件)
&1 (← 查看信件內容)
Message 1:
From cyj@localhost.localdomain Tue Feb 06 17:01:46 2007 (← 由 cyj 寄來的)
Envelope-to: yenjinc@localhost.localdomain
Delivery-date: Tue, 06 Feb 2007 17:01:46 +0800
To: yenjinc@localhost.localdomain
Subject: Hi (← Title 為 Hi)
From: cyj@localhost.localdomain
Date: Tue, 06 Feb 2007 17:01:46 +0800

Hello! Yenjinc! (← 信件內容確實為 file 的內容)

&

標準錯誤輸出『 Standard error』應 用範例:

cyj@debian:~$ touch file.txt (建立 file.txt )


cyj@debian:~$ ls -l > file.txt (將 ls –l 的結果輸出到 file.txt )
cyj@debian:~$ cat file.txt (查看 file.txt 內容)
total 0
-rw-r--r-- 1 cyj cyj 0 Feb 6 17:31 file.txt

cyj@debian:~$ lls -l >> file.txt (在一次 ls –l,將結果輸出到 file.txt)


-bash: lls: command not found (筆者故意打錯,打 lls –l 出現錯誤訊息)

- 58 -
cyj@debian:~$ cat file.txt (查看一下剛才的錯誤輸入結果)
total 0
-rw-r--r-- 1 cyj cyj 0 Feb 6 17:31 file.txt (← 剛才使用 >> 所以並不記載錯誤輸出)

cyj@debian:~$ lls -l 2>> file.txt (重新再來一次!使用 2>> 錯誤輸出)


(因為 2>> 已經寫入 file.txt)
(所以畫面不會出現錯誤訊息了)
cyj@debian:~$ cat file.txt (查看一下剛才的錯誤輸入結果)
total 0
-rw-r--r-- 1 cyj cyj 0 Feb 6 17:31 file.txt
-bash: lls: command not found (← 錯誤輸出的結果,已成功寫入囉!)

『Standard error、 Standard output』複合式應用:

cyj@debian:~$ touch test1 (建立 test1 檔案)


cyj@debian:~$ find /home/ -name test1 (使用 find 查找 /home 底下的 test1)
find: /home/yenjinc: Permission denied (← 出現 "權限不足" 的錯誤訊息)
/home/cyj/test1 (← 在 /home/cyj/ 順利找到 test1)

以上範例中,同時出現了 stdout 以及 stderr 訊息,


使用『2>&1』可以將 stderr 也跟著寫入到 stdout 的檔案內容。
(意指: stdout、stderr 都會同時寫入到一個檔案中)

cyj@debian:~$ find /home/ -name test1 > find.log 2>&1


(stdout、stderr 同時寫入到 find.log)
cyj@debian:~$ cat find.log (查看 find.log 內容)
find: /home/yenjinc: Permission denied (← 標準錯誤輸出,寫入成功。)
/home/cyj/test1 (← 標準輸出,寫入成功。)

以上是資料流重導向 (redirection) 的基本應用範例。最後筆者要介紹


Shell 底下的三個『命令執行判斷依據』的符號:
1. ;(分號) —作為命令與命令之間的分隔 符號。
2. && —當左邊的命令為 ”真”,才會執行右邊的命令。
3. || —當左邊的命令 “不為真”,才會執行右邊的命令。

以下為示範說明。

- 59 -
『;』應用:

在 Shell 中,;(分號) 作為命令與命令之間的分隔符號。


;(分號) 兩旁的指令,會各自做好各自的工作,不會彼此干擾 (彼此不會影響)。

cyj@debian:~$ touch file1 file2 ; ls -l ; echo 'Well done'


(以 ; 作為分隔,一共執行了三項命令)
(1. touch file1 file2)
(2. ls –l)
(3. echo ‘Well done’)
total 0 (← 命令二的標準輸出)
-rw-r--r-- 1 cyj cyj 0 Feb 6 17:48 file1 (同上)
-rw-r--r-- 1 cyj cyj 0 Feb 6 17:48 file2 (同上)
Well done (← 命令三的標準輸出)

『&&』、『 ||』應 用:

『&&』當左邊的命令為 ”真”,才會執行右邊的命令。

cyj@debian:~$ ls -l
total 0
-rw-r--r-- 1 cyj cyj 0 Feb 6 17:48 file1
-rw-r--r-- 1 cyj cyj 0 Feb 6 17:48 file2
cyj@debian:~$ rm * && echo "It's True" (刪除所有檔案,假使成真則顯示 It’s True)
It's True (刪除成功,所以秀出 It’s True)
cyj@debian:~$ ls -l (ls –l 已經找不到任何檔案了)
total 0

『||』當左邊的命令 ”不為真”,才會執行右邊的命令。

cyj@debian:~$ rm file* && echo "It's True" (再次刪除檔案,成功則顯示 It’s True)


rm: cannot remove `file*': No such file or directory
(← 目錄中已經沒有檔案可以刪除了)
(← 在此指令執行並非成功,所以不會顯示 It’s True)
cyj@debian:~$ rm file* || echo "It's not True" (← 這次改成『||』)
rm: cannot remove `file*': No such file or directory (一樣的錯誤訊息)
It's not True (← 顯示 It's not True)
(由於左邊的命令執行不為真,所以才會執行右邊命令)

- 60 -
6-4 管線應用

在上一章節所談的『資料流重導向』不論輸出或者輸入,對象都必須
是『裝置或檔案』。這一章所談的『管線應用』,概念上與資料流重導向類
似,但是它可以將一個程式的輸出導向到另一個程式的輸入。使用導管符號
( | ) pipeline 可以將兩個以上的命令連結在一起。各位可從下列圖示認識
管線命令的運方式。

管線命令的處理示意圖:

(圖示來源:鳥哥的私房菜)

管線 (pipeline) 可用來連結一連串的命令,當連結的命令超過兩個
以上時,第一個命令的文字串流 (text stream) 會藉由『管線』傳遞到下一
個命令。如上圖所示,一個命令的 stdout 會接由下一個命令當作 stdin 來
接收,直到最後一個導管命令結束時,將把結果秀到螢幕上。以下是基本的
管線應用範例。

『管線 (pipeline)』基本應用 :

cyj@debian:~$ ls /etc/ | less (← 將 ls /etc/ 的結果導向給 less 作分頁)


cyj@debian:~$ ls /etc/ | sort | less (← 同上,透過 sort 排序後,再給 less 作分頁)
cyj@debian:~$ ls /etc/ | sort | nl > file1.txt
(← 同上,排序後再以 nl 計算行數,最後重導向到 (寫入) file1.txt)
cyj@debian:~$ cat file1.txt | tail -5 (← 查看 file1.txt,以 tail -5 秀出倒數五行)
133 updatedb.conf
134 vim
135 w3m
136 wgetrc
137 zhcon.conf

- 61 -
6-5 線上資源

以上是 Bash Shell 的基礎介紹,Bash 的學習與應用是一個很重要的


課題,對於初學入門來說,目前只要先認識本章提到的這些內容,大致上就
沒什麼問題了唷!

Bash Shell 的教學與應用,不論市面上的書籍或者網站資源,都相當


豐富,若各位有興趣不妨參考以下資源:

相關資源:

『什麼是 Shell』
— http://linux.vbird.org/linux_basic/0320bash.php#bash_what

『指令的下達』
— http://linux.vbird.org/linux_basic/0320bash.php#bash_command

『命令別名與歷史命令』
— http://linux.vbird.org/linux_basic/0320bash.php#alias_history

『資料流重導向』
— http://linux.vbird.org/linux_basic/0320bash.php#redirect

『管線命令』
— http://linux.vbird.org/linux_basic/0320bash.php#pipe

『Getting Started with BASH』


— http://www.hypexr.org/bash_tutorial.php

『Bash Guide for Beginners』


— http://tille.xalasys.com/training/bash/

『bash Shell 入門 第三版』


— http://www.oreilly.com.tw/product_linux.php?id=a171

『精通 Shell Scripting』


— http://www.oreilly.com.tw/product2_unix.php?id=a202

- 62 -
第 7 章 Linux 基本工具
這裡要介紹的是 Linux 的基本工具使用,這些工具大多是 UNIX /
Linux 指令,因此不論您在任何 UNIX-Like 系統中,都能使用這些工具。
現在就帶領各位來熟悉 Linux 文字命令的使用,在第七章會提到的內容
分成以下七個部份:

1. 檔案與目錄操作
2. 打包與壓縮
3. 更改檔案權限
4. 搜尋檔案
5. 文字過濾器
6. 萬用字元
7. 正規表示式

在這裡筆者會介紹相關指令的基本概念以及範例應用,大家不妨一邊按
照講義的內容進行練習,用身體來記住每一個指令的使用哦!

7-1 檔案與目錄操作

在 Linux 純文字模式下,我們需要下達『指令』來完成所有的任務,
使用指令來管理檔案跟目錄是非常有效率的。各位可以想像一下,在圖形化
視窗系統中,假使您想要把系統中,所有的 *.txt 純文字檔全部都刪除,
這大概要花多少時間才能完成呢?

在文字命令模式下,只要打一行指令就能馬上解決,剩下的時間,
不妨呵杯咖啡,休息一下呢!

只要打『一行』指令就能搞定!
cyj@debian:~$ sudo find / -name *.txt -exec rm {} \; (刪除系統所有的 *.txt 檔案)

- 63 -
在這部份我們會談到的指令列整如下:

查詢狀態列
ls 查看目錄內容
pwd 查看目前所在目錄位置
目錄類
cd 切換目錄
mkdir 建立目錄
rmdir 刪除空目錄 (如果目錄裡有資料,要用 rm -R )
檔案類
touch 建立空檔案 (touch 實際的用法是改變檔案建立時間)
rm 刪除檔案 (刪除目錄可打 rm -R)
cp 複製檔案 (複製目錄可打 cp -R)
mv 搬移檔案或更名
ln 連結檔案 (類似建立捷徑的意思)
觀看檔案類
cat 觀看檔案內容
less 觀看檔案內容 (以頁顯示,可以上下捲動)
more 觀看檔案內容 (以頁顯示,不能上下捲動)
head 觀看檔案的開頭起始行 (預設為開頭 10 行)
tail 觀看檔案的結尾倒數行 (預設為倒數 10 行)
查詢手冊類
man 查看指令的用法 (manpage)
info 查看指令的用法 (同 manpage,但具有超連結)

登入到系統時,會看到 Shell 的提示符號,等待使用者下達指令:

yenjinc @ riemann : ~ $

- 64 -
使用『man』查看一下 『ls』的說明 :

cyj@debian:~$ man ls (看 ls 的 manpage 使用說明)

以下筆者將較為重要的部份節錄出來

NAME
ls - list directory contents

SYNOPSIS
ls [OPTION]... [FILE]...

OPTIONS

-a, --all
do not hide entries starting with .

-d, --directory
list directory entries instead of contents, and do not derefer-
ence symbolic links

-i, --inode
print index number of each file

-l use a long listing format

『ls』使用範例 (一):

cyj@debian:~$ pwd (← 使用 pwd 列示目前所在位置)


/home/cyj

cyj@debian:~$ ls / (← ls 查看根目錄 / 的內容)


bin cdrom etc initrd lib media opt root srv tmp var
boot dev home initrd.img lost+found mnt proc sbin sys usr vmlinuz

cyj@debian:~$ ls -l /home/ (← 使用『長格式』來顯示 /home 的內容)


total 3
drwxr-x--- 2 cyj cyj 1024 Feb 6 18:34 cyj
drwxr-xr-x 2 denny denny 1024 Feb 6 20:10 denny
drwxr-x--- 2 yenjinc yenjinc 1024 Feb 5 15:24 yenjinc

- 65 -
『ls –l』長格式所顯示的各欄位涵意,筆者由下方說明:

cyj@debian:~$ ls -l /home/ (← 使用『長格式』來顯示 /home 的內容)


total 3
d rwxr-x--- 2 cyj cyj 1024 Feb 6 18:34 cyj
d rwxr-xr-x 2 denny denny 1024 Feb 6 20:10 denny
d rwxr-x--- 2 yenjinc yenjinc 1024 Feb 5 15:24 yenjinc

(1) (2) (3) (4) (5) (6) (7) (8)

各欄位代表意義:
(1) 檔案類型 ( "d" 代表目錄,"–" 代表檔案)
(2) 權限 (在『』章節會說明)
(3) 硬式連結的數目 (在『』章節會說明)
(4) 擁有者
(5) 群組
(6) 檔案大小 (或儲存目錄資訊所佔用的空間)
(7) 最後變更的日期
(8) 檔名

詳細的意義內容,筆者在後面的章節中,會陸續介紹給各位認識。

『ls』使用範例 (二):

cyj@debian:~$ ls -a (← 使用 –a 列示包含以 . 為開頭的隱藏檔)


. .. .bash_history .bash_profile .bashrc

cyj@debian:~$ ls -al (← 使用 –al 將隱藏檔內容以長格式顯示)


total 6
drwxr-x--- 2 cyj cyj 1024 Feb 6 18:34 .
drwxrwsr-x 5 root staff 1024 Feb 6 20:10 ..
-rw------- 1 root root 32 Feb 5 15:28 .bash_history
-rw-r--r-- 1 cyj cyj 567 Feb 5 15:18 .bash_profile
-rw-r--r-- 1 cyj cyj 1834 Feb 5 15:18 .bashrc
在 UNIX / Linux,指令的 Option 選項,可以同時『寫在一起』,譬如 –al 這樣。

- 66 -
接著下來,我們要一口氣將這些檔案與目錄管理指令看完。建議大家可
以跟著講義練習,也不妨查看各個指令的 manpage,相信會更加熟悉指令
的用法唷!

『檔案與目錄』相關 指令應用:

cyj@debian:~$ pwd (← 使用 pwd 查看目前所在目錄)


/home/cyj

cyj@debian:~$ cd /tmp (← cd 進入到 /tmp )


cyj@debian:/tmp$ mkdir DENNY (← 使用 mkdir 建立 DENNY 目錄)
cyj@debian:/tmp$ ls -ld DENNY/ (← -ld 以長格式顯示目錄本身的狀態)
drwxr-xr-x 2 cyj cyj 1024 Oct 15 13:24 DENNY/

cyj@debian:/tmp$ mkdir DENNY2 (← 使用 mkdir 建立 DENNY2 目錄)

cyj@debian:/tmp$ ls -ld DENNY*


drwxr-xr-x 2 cyj cyj 1024 Oct 15 13:24 DENNY
drwxr-xr-x 2 cyj cyj 1024 Oct 15 13:24 DENNY2

cyj@debian:/tmp$ rmdir DENNY/ (← 使用 rmdir 刪除 DENNY 空目錄)


cyj@debian:/tmp$ rm -R DENNY2/ (← 假使非空目錄,則需使用 rm -R 來刪除)

cyj@debian:/tmp$ mkdir TEST (← 使用 mkdir 建立 TEST 目錄)


cyj@debian:/tmp$ cd TEST/
cyj@debian:/tmp/TEST$ touch A.mp3 B.mp3 C.mp3
(← 使用 touch 指令,建立三個檔案,檔名分別為 A.mp3 B.mp3 C.mp3)

cyj@debian:/tmp/TEST$ mkdir MP3


cyj@debian:/tmp/TEST$ ls
A.mp3 B.mp3 C.mp3 MP3

cyj@debian:/tmp/TEST$ mv *.mp3 MP3/


(← 使用 mv 指令,將 *.mp3 搬移到 MP3 目錄中)

cyj@debian:/tmp/TEST$ ls MP3/
A.mp3 B.mp3 C.mp3

cyj@debian:/tmp/TEST$ cp MP3/* .
(← 使用 cp 指令,將 MP3/* 的所有檔案複製到當前目錄)

- 67 -
cyj@debian:/tmp/TEST$ ls
A.mp3 B.mp3 C.mp3 MP3

cyj@debian:/tmp/TEST$ cp -R MP3 MP3-backup (← 使用 cp –R 複製一整個目錄)


cyj@debian:/tmp/TEST$ ls
A.mp3 B.mp3 C.mp3 MP3 MP3-backup

cyj@debian:/tmp/TEST$ rm -Rf MP3* (← 使用 rm –Rf ,強制刪除 MP3* 目錄)


cyj@debian:/tmp/TEST$ ls
A.mp3 B.mp3 C.mp3

cyj@debian:/tmp/TEST$ rm *
cyj@debian:/tmp/TEST$ cd ..
cyj@debian:/tmp$ rmdir TEST/

以上是基本的檔案與目錄操作範例介紹,接下來,我們要來認識『ln』
連結檔案的指令。在這之前,筆者先簡略的介紹一下『inode』的概念,不
然大家可能會被 ln 的硬連結、軟連結,搞的頭昏腦脹唷!

在系統中,任何的檔案都有一個『獨一無二』的編號,它就是 inode
編號。inode 編號存放著有關這個檔案的相關資訊,這些相關資訊都可以
從 inode table 找到相對應的內容。

各位可以從下圖來了解 inode 與 inode table 的關係:

INODE INODE TABLE


NAME INODE INODE 擁有人 擁有群組 權限 最後更動日期 其他

File 1 162 162 Denny Denny 755 2006-06-14 Others

File 2 196 196 yenjinc yenjinc 644 2006-07-02 Others

檔案的 inode 會對應到 inode table。inode table 會紀錄著這個檔案


的一些相關資訊。從上面的圖例來看,File1 的 inode 為 162,因此對應到

- 68 -
inode table 的 162 時,在此會紀錄著有關 File1 的相關資訊,譬如:檔案
擁有人、權限、最後更動日期等。

我們可以使用 ls –i 來查看檔案的 inode 資訊:

cyj@debian:~$ ls -li (←『–i』選項,表示要顯示檔案的 inode 資訊)


total 20
589829 drwxr-xr-x 2 cyj cyj 4096 Aug 13 09:40 bin
245785 drwxr-xr-x 2 cyj cyj 4096 Aug 13 11:33 conf
2490428 drwxr-xr-x 2 cyj cyj 4096 Aug 12 09:28 public_html

《檔案的 inode 資訊》

有了 inode 的概念後,我們接著來看『ln』的使用方式。

簡單的說,ln 就像是各位在 Windows 系統中『建立捷徑』的意思,


但是功能上又不像捷徑那樣的單純容易!在 Linux,建立 ln 連結有兩種方式
:一種是建立『硬式連結』,另一種則是建立『軟式連結』。

『硬式連結』 —
無 “來源檔” 與 “目的檔” 的分別,因為都是同樣的 Inode。

來源檔案
硬碟
$ ln [來源檔] [目的檔]
( 使用同一 inode。)
目的檔案

『軟式連結』 —
有 “來源檔” 與 “目的檔” 的分別,兩者屬於不同的 Inode。

來源檔案
硬碟
$ ln -s [來源檔] [目的檔]
( 建立捷徑,分屬於不同 inode。)
目的檔案

- 69 -
使用『man』查看一下 『ln』的說 明 :

cyj@debian:~$ man ln (看 ln 的 manpage 使用說明)

以下筆者將較為重要的部份節錄出來

NAME
ln - make links between files

SYNOPSIS
ln [OPTION]... TARGET [LINK_NAME]
ln [OPTION]... TARGET... DIRECTORY
ln [OPTION]... --target-directory=DIRECTORY TARGET...

OPTIONS

Create hard links by default, symbolic links with --symbolic.

-s, --symbolic
make symbolic links instead of hard links

『ln –s』建立軟式連結:

cyj@debian:~$ ln -s File1 File1-SoftLink (← ln –s 表示建立軟連結)


cyj@debian:~$ ls -li
total 0
343394 -rw-r--r-- 1 cyj cyj 0 Oct 15 15:40 File1
343395 lrwxrwxrwx 1 cyj cyj 10 Oct 15 15:40 File1-SoftLink -> File1

使用 ln –s 建立軟連結,產生的『捷徑』會以 → 符號指向來源檔案,
而且兩者的 inode 並不相同,表示兩個是個別的檔案,彼此有相依關係。

『ln』建立硬式連 結:

cyj@debian:~$ ln File1 File1-HardLink (← 不加任何選項,預設為建立硬連結)


cyj@debian:~$ ls -li
total 0
343394 -rw-r--r-- 2 cyj cyj 0 Oct 15 15:40 File1

- 70 -
343394 -rw-r--r-- 2 cyj cyj 0 Oct 15 15:40 File1-HardLink
343395 lrwxrwxrwx 1 cyj cyj 10 Oct 15 15:40 File1-SoftLink -> File1

可以從上面看到,『硬式連結數』已經從 1 增加成 2 囉!表示該檔案


目前共有兩個硬式連結。另外它們的 inode 是一樣的,表示兩個是一模一樣
的檔案,只不過做了一個映射而已唷!

為了區別兩者的差異,筆者在下面舉一個應用範例:

cyj@debian:~$ rm File1 (← 將原始的 File1 刪除)


cyj@debian:~$ ls -li
total 0
343394 -rw-r--r-- 1 cyj cyj 0 Oct 15 15:40 File1-HardLink
343395 lrwxrwxrwx 1 cyj cyj 10 Oct 15 15:40 File1-SoftLink -> File1

cyj@debian:~$ cat File1-SoftLink (← 軟式連結已經失效)


cat: File1-SoftLink: No such file or directory

cyj@debian:~$ cat File1-HardLink (← 硬式連結依然正常)

因為『軟式連結』所指向的原始檔已經被刪除了,所以當我們查看
File1-SoftLink 的內容時,它會出現『找不到檔案』的錯誤訊息;相對的
,若您去查看 File1-HardLink 的內容時,則不會有任何的問題。這是因為
『硬式連結』本來就沒有來源檔與目的檔的差別 (兩者屬於同一個 inode )
,不管您刪除哪一個,對它本身並不會有任何的影響唷!

以上是 ln 的基本介紹,各位若有興趣不妨也參考以下資源。

相關資源:

『鳥哥的私房菜 - inode 介紹』


— http://linux.vbird.org/linux_basic/0230filesystem.php#harddisk-inode

『鳥哥的私房菜 - 連結檔 ln 的介紹』


— http://linux.vbird.org/linux_basic/0230filesystem.php#ln

- 71 -
最後,筆者要來介紹『觀看檔案類』以及『查詢使用手冊類』的指令應
用。在 Linux 系統中,各位可以使用下面這些指令來查看檔案的內容。

觀看檔案類
cat 觀看檔案內容
less 觀看檔案內容 (以頁顯示,可以上下捲動)
more 觀看檔案內容 (以頁顯示,不能上下捲動)
head 觀看檔案的開頭起始行 (預設為開頭 10 行)
tail 觀看檔案的結尾倒數行 (預設為倒數 10 行)

『cat、less、more』指令應用 :

cyj@debian:~$ cat /etc/inittab (← 用 cat 瀏覽 /etc/inittab )


cyj@debian:~$ cat /etc/inittab | less (← 將 cat 的結果交給 less 處理)
cyj@debian:~$ less /etc/inittab (← 用 less 將內容以頁顯示)
cyj@debian:~$ more /etc/inittab (← 用 more 將內容以頁顯示)

這些指令都可以用來查看檔案的內容。cat 會一次秀完檔案的內容;
more 是以頁顯示,但不能上下捲頁。筆者認為最好用的還是 less,因為
less 可以讓您自由的上下捲頁唷!

『head』指 令應用:

head 在不加任何選項下,預設為顯示檔案的『開頭』10行。
cyj@debian:~$ head /etc/inittab
1. # /etc/inittab: init(8) configuration.
2. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
3.
4. # The default runlevel.
5. id:2:initdefault:
6.
7. # Boot-time system configuration/initialization script.
8. # This is run first except when booting in emergency (-b) mode.
9. si::sysinit:/etc/init.d/rcS
10.

- 72 -
『tail』指令應用:

tail 在不加任何選項下,預設為顯示檔案的『倒數』10行。
cyj@debian:~$ tail /etc/inittab
1.
2. # Example how to put a getty on a serial line (for a terminal)
3. #
4. #T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
5. #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
6.
7. # Example how to put a getty on a modem line.
8. #
9. #T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
10.

筆者出個問題,來考考各位:假使我想將 /etc/inittab 的檔案內容,


從第 13 行到第 18 行的內容秀出來,該如何做呢?

cyj@debian:~$ nl /etc/inittab > TMP


(← 將 /etc/inittab 使用 nl 指令分行後,將結果儲存為 TMP 檔案)

cyj@debian:~$ head -18 TMP | tail -6


13 # Runlevel 0 is halt.
14 # Runlevel 1 is single-user.
15 # Runlevels 2-5 are multi-user.
16 # Runlevel 6 is reboot.
17 l0:0:wait:/etc/init.d/rc 0
18 l1:1:wait:/etc/init.d/rc 1
(← head、tail 與 pipeline 應用)
(← 去頭截尾的把第 13–18 行的內容擷取出來)

這個範例應用到『>』redirection、『|』Pipeline 等觀念,
如果各位還不太熟悉,可以回到『』章節補充一些背景知識唷!

在 UNIX / Linux 下,很少有人能夠完全記熟所有指令的用法。即使是


系統專家,當他遇到不熟的指令時,還是束手無策。於是在系統中有一個
『線上求助』專門在解答這些指令的用法,它就是『manpage』。

- 73 -
要查看指令的使用說明 (manpage) 有兩種方式:

(1). man 指令 (ex: man ls)


(2). info 指令 (ex: info ls)

各位在碰到不熟的指令時,記得使用 man、info 指令來查看使用手冊唷!

cyj@debian:~$ man ls (← 查看 ls 的 manpage )


cyj@debian:~$ info ls (← 查看 ls 的 info page )

本章節的 Linux 指令就介紹到這裡,以下筆者列舉幾個不錯的網頁


資料,提供給各位延伸學習囉!

相關資源:

『Linux 基本工具介紹』
— http://kalug.linux.org.tw/~lloyd/LLoyd_Hand_Book/book/linux-base-file-utils.html

『鳥哥的私房菜—Linux 檔案與目錄管理』
— http://linux.vbird.org/linux_basic/0220filemanager.php

『鳥哥的私房菜—Linux系統上的線上求助』
— http://linux.vbird.org/linux_basic/0160startlinux.php#manual

- 74 -
7-2 打包與壓縮

打包的概念其實就是『集結檔案』的意思,好比今天各位去超商買了一
大堆的東西,如果我們不買袋子的話,那就需要很多人幫忙拿,可是假使我
們用一個大袋子把它們都裝起來後,那就會變得很好拿了。

在檔案處理上,假如您要傳一百個檔案給對方,我們可以把這一百個檔
案『打包』起來後,直接傳一個檔案就行了。假使這個打包檔案太大了,這
時候就需要用到『檔案壓縮』的工具囉!

在這一節裡,筆者將要來介紹這些打包與壓縮的 Linux 指令,這裡會


提到的指令,列表如下。

打包工具
tar 將檔案集結 (打包起來)
壓縮工具
gzip 把檔案壓縮
gunzip 把 gzip 檔案解壓縮 (同 gzip -d)
bzip2 把檔案壓縮 (較佳的壓縮比)
bunzip2 把 bzip2 檔案解壓縮 (同 bzip2 -d)

打包與壓縮檔案之副 檔名
tar *.tar
gzip *.tar.gz 或 *.tgz
bzip2 *.bz2

首先我們來看 tar 這個指令的應用。tar 指令的使用方式如下:

cyj@debian:~$ tar –cvf myhome.tar /home/cyj


cyj@debian:~$ tar [選項] 檔案名稱 [要打包的檔案]

- 75 -
使用『man』查看一下 『tar』的 說 明:

cyj@debian:~$ man tar (看 tar 的 manpage 使用說明)

以下筆者將較為重要的部份節錄出來

NAME
tar - The GNU version of the tar archiving utility

SYNOPSIS
tar [ - ] A --catenate --concatenate | c --create | d --diff --compare
| --delete | r --append | t --list | u --update | x --extract --get

[ options ]

filename1 [ filename2, ... filenameN ]

directory1 [ directory2, ...directoryN ]

EXAMPLES
tar -xvvf foo.tar
extract foo.tar

tar -xvvzf foo.tar.gz


extract gzipped foo.tar.gz

tar -cvvf foo.tar foo/


tar contents of folder foo in foo.tar

FUNCTION LETTERS
One of the following options must be used:

-c, --create
create a new archive

-t, --list
list the contents of an archive

-x, --extract, --get


extract files from an archive

- 76 -
OTHER OPTIONS

-C, --directory DIR


change to directory DIR

-f, --file [HOSTNAME:]F


use archive file or device F (default "-", meaning stdin/stdout)

-j, --bzip2
filter archive through bzip2, use to decompress .bz2 files.

-v, --verbose
verbosely list files processed

-z, --gzip, --gunzip, --ungzip


filter the archive through gzip

『tar』常用的基 本選項:

–c: create 建立包裝檔 (打包)


–x: extract 解開包裝檔
–v: verbose 顯示詳細資訊
–f: file 指定包裝檔名
–t: list 顯示檔案的內容
–C: change directory 切換到目錄中
–z: gzip 支援 gzip 壓縮或解壓縮
–j: bzip2 支援 bzip2 壓縮或解壓縮

底下筆者將舉例示範 tar 命令的基本使用。

『打包檔案』:

cyj@debian:~$ ls -l (← 先查看目錄下有那些檔案)
total 20
drwxr-xr-x 2 cyj cyj 4096 Aug 7 13:49 File
drwxr-xr-x 9 cyj cyj 4096 Aug 17 15:57 Project
drwxr-xr-x 2 cyj cyj 4096 Aug 13 09:40 bin
drwxr-xr-x 2 cyj cyj 4096 Aug 13 11:33 conf
drwxr-xr-x 2 cyj cyj 4096 Aug 12 09:28 public_html

- 77 -
cyj@debian:~$ tar -cvf File1.tar bin conf public_html
(← 常用的打包選項為『-cvf』)
(← 上述的例子表示,將 bin、conf、public_html 三個目錄打包成 File1.tar )
bin/
bin/tmp.sh
conf/
conf/httpd.conf
conf/httpd-ssl.conf
conf/vsftpd.conf
conf/vsftpd.conf.ori
conf/vsftpd.pem
conf/vsftpd.user_list
public_html/
public_html/index.php
(← 因為有加上『-v』,所以會顯示打包過程)

cyj@debian:~$ ls -l File1.tar (← 順利打包完成)


-rw-r--r-- 1 cyj cyj 102400 Oct 15 22:56 File1.tar

『解包檔案』:

cyj@debian:~$ mkdir TMP (← 建立 TMP 空目錄)


cyj@debian:~$ tar -xvf File1.tar -C TMP
(← 常用的解包選項為『-xvf』)
(← 上述的例子表示,將 File1.tar 解包到 TMP 目錄中)
bin/
bin/tmp.sh
conf/
conf/httpd.conf
conf/httpd-ssl.conf
conf/vsftpd.conf
conf/vsftpd.conf.ori
conf/vsftpd.pem
conf/vsftpd.user_list
public_html/
public_html/index.php
(← 因為有加上『-v』,所以會顯示解包過程)

cyj@debian:~$ ls TMP/ (← 順利解包完成)


bin conf public_html

- 78 -
『顯示包裝檔案內容 』:

cyj@debian:~$ tar -tf File1.tar


(← 使用『-t』可以查看包裝檔案的內容)
(← 僅是顯示內容,並未真正解開包裝)
bin/
bin/tmp.sh
conf/
conf/httpd.conf
conf/httpd-ssl.conf
conf/vsftpd.conf
conf/vsftpd.conf.ori
conf/vsftpd.pem
conf/vsftpd.user_list
public_html/
public_html/index.php
(← 顯示出 File1.tar 包裝檔案的內容)

以上是基礎的 tar 指令應用,接著我們要來看 gzip / bzip2 壓縮檔案


的使用範例。

『gzip』壓縮 與解壓縮:

gzip 壓縮
cyj@debian:~$ gzip File1.tar (← 在 gzip 後面直接加上檔名就可以壓縮了)
cyj@debian:~$ ls -l File1.tar.gz (← 壓縮後副檔名變成了 .tar.gz )
-rw-r--r-- 1 cyj cyj 32055 Oct 15 22:56 File1.tar.gz

gzip 解壓縮
cyj@debian:~$ gzip -d File1.tar.gz
(← 加上『-d』就可以解壓縮了)
(←『gzip -d』等同於『gunzip』)
(← 因此也可以使用『gunzip File1.tar.gz』來解壓縮)

cyj@debian:~$ ls -l File1.tar (← 原本的檔案已經復原了)


-rw-r--r-- 1 cyj cyj 102400 Oct 15 22:56 File1.tar

- 79 -
『bzip2』壓 縮與解壓縮:

bzip2 壓縮
cyj@debian:~$ bzip2 File1.tar (← 在 bzip2 後面直接加上檔名就可以壓縮了)
cyj@debian:~$ ls -l File1.tar.bz2 (← 壓縮後副檔名變成了 .tar.bz2 )
-rw-r--r-- 1 cyj cyj 22664 Oct 15 22:56 File1.tar.bz2
(← 因為演算法的不同,採用 bzip2 壓縮後的檔案會比 gzip 壓的要小)

bzip2 解壓縮
cyj@debian:~$ bzip2 -d File1.tar.bz2
(← 加上『-d』就可以解壓縮了)
(←『bzip2 -d』等同於『bunzip2』)
(← 因此也可以使用『bunzip2 File1.tar.bz2』來解壓縮)

cyj@debian:~$ ls -l File1.tar (← 原本的檔案已經復原了)


-rw-r--r-- 1 cyj cyj 102400 Oct 15 22:56 File1.tar

上面是 gzip / bzip2 的獨立應用方式,接下來我們要來看 tar 與


gzip / bzip2 的搭配用法。tar 的 –z、–j 選項,可以用來壓縮檔案。

『tar、gzip / bzip2』的搭配 應用:

cyj@debian:~$ ls (← 查看目錄現有那些檔案)
File Project bin conf public_html File1.tar

cyj@debian:~$ tar -czvf File1.tgz public_html


public_html/
public_html/index.php
(← 加上『-z』表示打包時直接以 gzip 壓縮)
(← 將 public_html 打包並且以 gzip 壓縮)

cyj@debian:~$ tar -cjvf File1.bz2 public_html


public_html/
public_html/index.php
(← 加上『-j』表示打包時直接以 bzip2 壓縮)
(← 將 public_html 打包並且以 gzip 壓縮)

- 80 -
cyj@debian:~$ mkdir TMP1 TMP2 (← 建立兩個空目錄)
cyj@debian:~$ tar -zxvf File1.tgz -C TMP1 (← 將 File1.tgz 解壓縮至 TMP1)
public_html/
public_html/index.php
(← 加上『-z』可使 tar 針對 .gz/.tgz 的包裝檔案,以 gzip 解壓縮)

cyj@debian:~$ tar -jxvf File1.bz2 -C TMP2 (← 將 File1.bz2 解壓縮至 TMP2)


public_html/
public_html/index.php
(← 加上『-j』可使 tar 針對 .bz2 的包裝檔案,以 bzip2 解壓縮)

cyj@debian:~$ ls TMP*
TMP1:
public_html

TMP2:
public_html
(← 驗證一下,剛才的解壓縮例子,順利成功!)

各位若有興趣,不妨參考各指令的 manpage,然後實地的操作一番,
相信很快就能駕輕就熟了唷!本章節是筆者對於『打包與壓縮』指令的應用
介紹。假使各位想了解更多資訊,建議大家不妨參考以下資源。

相關資源:

『鳥哥的私房菜—檔案的壓縮與打包』
— http://linux.vbird.org/linux_basic/0240tarcompress.php

『柏青哥的 SuSE Linux—基本的壓縮指令』


— http://paching.myweb.hinet.net/lesson7.htm#1

『柏青哥的 SuSE Linux—tar 指令』


— http://paching.myweb.hinet.net/lesson7.htm#5

- 81 -
7-3 更改檔案權限

在 Linux 系統下,每一個檔案都有著相關的屬性,這些屬性背後所代
表的意義也是一門重要的課題。在『7-1 檔案與目錄操作』我們提到了 ls –l
的長格式屬性,其中第一欄位即是權限的意思,筆者在下面為各位說明權限
欄位中各符號的代表的意義。

cyj@debian:~$ ls -l
total 20
drwxr-xr-x 2 cyj cyj 4096 Aug 7 13:49 File
drwxr-xr-x 9 cyj cyj 4096 Aug 17 15:57 Project
drwxr-xr-x 2 cyj cyj 4096 Aug 13 09:40 bin
drwxr-xr-x 2 cyj cyj 4096 Aug 13 11:33 conf
drwxr-xr-x 2 cyj cyj 4096 Aug 12 09:28 public_html

《檔案的權限》

『權 限符號』的代 表意義:
Other 權限
(其他人的權限)

– rwx rwx rwx Sitemap.txt


d rwx rwx rwx MyDirectory 檔案的名稱

Group 權限
檔案類型 User 權限
(擁有群組的權限)
代表符號 (擁有人的權限)

任何檔案都有其相關的『權限屬性』,在此分成三種:

1. User 權限: 檔案擁有人 對於該檔案能做哪些事情。


2. Group 權限: 群組使用者 對於該檔案能做哪些事情。
3. Other 權限: 其他所有人 對於該檔案能做哪些事情。

- 82 -
筆者將所有相關的符號意義整理如下:

檔案類型代表符號
– Regular Files (表示一般的檔案)
d Directory (目錄)
l Link Files (連結檔案)

使用權限 符號 對於檔案 對於目錄


讀取 r 檢視檔案內容 列示目錄的內容
寫入 w 寫入 / 變更檔案 建立 / 移除 目錄中的檔案
執行 x 將檔案當成程式來執行 允許切換 (cd) 到目錄中

對於檔案而言:
若它具有『r』的權限,表示各位可使用任何的工具來『讀取』檔案的
內容。如果它擁有『w』的權限,表示各位可以任意的『寫入與變更』檔案
;如果它具有『x』的權限,表示可以把檔案『當作程式』來執行。

對於目錄而言:
若它具有『r』的權限,表示各位可以使用類似 ls 等指令來『列示』
目錄的內容。如果它擁有『w』的權限,表示各位可以對於該目錄中的檔案
做『任何的處置』(建立、刪除或變更等)。若它具有『x』的權限,表示這個
目錄允許使用者切換 (cd 進入) 到目錄中;換句話說,假使目錄不賦予『x』
權限的話,那麼大家將無法進入 (cd) 到目錄之中唷!

我們來看一些示範的例子:

cyj@debian:~$ ls -l
total 20
drwxr-xr-x 9 cyj cyj 4096 Aug 17 15:57 Project
-rw-r--r-- 1 cyj cyj 0 Oct 16 12:47 File1
(← 這裡可以看到一個 Project 目錄,一個 File 檔案)
(← 檔案的擁有人與群組都是 cyj )

- 83 -
Project 目錄的屬性
User : rwx 可讀,可寫入,可執行。
Group : r-x 可讀,不可寫入,可執行。
Other : r-x 可讀,不可寫入,可執行。
(← cyj 使用者 擁有最大的權限,可以做任何事情 )
(← cyj 群組 可以『讀取、進入』,但是無法『寫入』任何東西 )
(← 其他人 同樣只有『讀取、進入』的權限而已,無法『寫入』)

File1 檔案的屬性
User : rw- 可讀,可寫入,不可執行。
Group : r-- 可讀,不可寫入,不可執行。
Other : r-- 可讀, 不可寫入,不可執行。
(← cyj 使用者 可以『讀取、寫入 / 修改』檔案,但是不能『執行』它 )
(← cyj 群組 可以『讀取』檔案,但是不能『寫入』與『執行』它 )
(← 其他人 同樣只能夠『讀取』而已 )

有了這些概念後,我們接著要來看『更改權限』的 Linux 命令操作。


在這部份筆者會提到的指令,列表如下:

更改檔案權限
chmod 更改檔案的存取權限
chown 更改檔案的擁有者或擁有群組
chgrp 更改檔案的擁有群組

『chmod』基 礎用法:

$ chmod [選項] [新的權限] [檔案]


$ chmod u=rwx,g=rx,o=rx File.txt
$ chmod -Rf 755 Directory

『遞迴式、強制』的將目錄 權限設定有兩種方式,分別為『符號
底下所有的檔案更改為新的 表示法』與『數字表示法』,筆者在
權限。 下面為各位做說明與示範。

- 84 -
符號表示法:

(User) u + r 應用範例:

(Group) g – w $ chmod u+x File.txt


$ chmod g=rw File.txt
(Other) o = x $ chmod u=rx,g+x,o-wx File.txt
(All) a $ chmod a+x File.txt

數字表示法:

User Group Other


Read Write Execute Read Write Execute Read Write Execute
400 200 100 40 20 10 4 2 1

r 4 應用範例:
$ chmod 755 File.txt (755 表示 rwxr-xr-x)
w 2 $ chmod 644 File.txt (644 表示 rw-r--r--)
$ chmod 730 File.txt (730 表示 rwx-wx---)
x 1 $ chmod 102 File.txt (102 表示 --x----w-)

以下是 chmod 指令的應用範例:

以 ls -l 查看檔案 的原始權限
cyj@debian:~$ ls -l
total 0
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File01
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File02
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File03
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File04
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File05

- 85 -
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File06
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File07
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File08
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File09
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:12 File10

以『數字表示法』更改 檔案權限
cyj@debian:~$ chmod 742 File01
cyj@debian:~$ chmod 135 File02
cyj@debian:~$ chmod 246 File03
cyj@debian:~$ chmod 341 File04
cyj@debian:~$ chmod 271 File05

以『符號表示法』更改 檔案權限
cyj@debian:~$ chmod u=rw,g=x,o=wx File06
cyj@debian:~$ chmod g-wx,o+x File07
cyj@debian:~$ chmod a-wx File08
cyj@debian:~$ chmod u+rx,o-x File-9
cyj@debian:~$ chmod a-rwx File10

更改完成後的檔案權限
cyj@debian:~$ ls -l
total 0
-rwxr---w- 1 cyj cyj 0 Oct 16 20:12 File01
---x-wxr-x 1 cyj cyj 0 Oct 16 20:12 File02
--w-r--rw- 1 cyj cyj 0 Oct 16 20:12 File03
--wxr----x 1 cyj cyj 0 Oct 16 20:12 File04
--w-rwx--x 1 cyj cyj 0 Oct 16 20:12 File05
-rw---x-wx 1 cyj cyj 0 Oct 16 20:12 File06
-rw-r--r-x 1 cyj cyj 0 Oct 16 20:12 File07
-r--r--r-- 1 cyj cyj 0 Oct 16 20:12 File08
-rwxr--r-- 1 cyj cyj 0 Oct 16 20:12 File09
---------- 1 cyj cyj 0 Oct 16 20:12 File10

以上是 chmod 更改檔案權限的基本介紹,接著我們來看另外兩個


更改檔案屬性 chown、chgrp 的使用介紹。

- 86 -
chown 更改檔案的擁有者或擁有群組
chgrp 更改檔案的擁有群組

藉由剛才 chmod 的使用介紹,各位已經了解『檔案權限』的意義了


,現在我們要來看『檔案擁有人、檔案擁有群組』的基礎概念。

cyj@riemann:~$ ls -l
total 20
drwxr-xr-x 2 cyj cyj 4096 Aug 7 13:49 File
drwxr-xr-x 9 cyj cyj 4096 Aug 17 15:57 Project
drwxr-xr-x 2 cyj cyj 4096 Aug 13 09:40 bin
drwxr-xr-x 2 cyj cyj 4096 Aug 13 11:33 conf
drwxr-xr-x 2 cyj cyj 4096 Aug 12 09:28 public_html

《檔案擁有人》 《檔案擁有群組》

cyj@riemann:~$ ls -l /home/
total 220
drwxr-xr-x 5 apua apua 4096 Oct 16 11:19 apua
drwxr-xr-x 3 bill bill 4096 Sep 18 09:55 bill
drwxr-xr-x 4 bluelight bluelight 4096 Sep 18 10:11 bluelight
drwxr-xr-x 4 board board 4096 Aug 24 12:01 board
drwxr-xr-x 3 chang chang 4096 Aug 11 13:16 chang
drwxr-xr-x 3 chenmvm0 chenmvm0 4096 Aug 11 13:16 chenmvm0
drwxr-xr-x 9 cyj cyj 4096 Oct 16 20:12 cyj
drwxr-xr-x 7 czhsu czhsu 4096 Oct 9 22:57 czhsu

《檔案擁有人》《檔案擁有群組》

在系統中,每一個檔案都會有擁有者與擁有群組,我們可以從家目錄
(/home) 中清楚的看出來:『每一位使用者都是他們家目錄的擁有者以及
擁有群組』。 chown、chgrp 這兩個指令的功用,即是用來更改檔案擁有
人以及擁有群組。

- 87 -
這兩個指令的使用方式,筆者由下方的範例來為各位介紹。

查看一下『chown、chgrp』 的 manpage:

cyj@debian:~$ man chown (看 chown 的 manpage )


以下筆者將較為重要的部份節錄出來

NAME
chown - change file owner and group

SYNOPSIS
chown [OPTION]... OWNER[:[GROUP]] FILE...
chown [OPTION]... :GROUP FILE...
chown [OPTION]... --reference=RFILE FILE...

OPTIONS

-f, --silent, --quiet


suppress most error messages

-R, --recursive
operate on files and directories recursively

cyj@debian:~$ man chgrp (看 chgrp 的 manpage )


以下筆者將較為重要的部份節錄出來

NAME
chgrp - change group ownership

SYNOPSIS
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...

OPTIONS

-f, --silent, --quiet


suppress most error messages

-R, --recursive
operate on files and directories recursively

- 88 -
『chown』基礎用 法:

若要使用 chown 更改檔案的所有權,必須擁有超級使用者的權限哦!


# chown [選項] [擁有者] : [擁有群組] [檔案]
# chown yenjinc : users File.txt
# chown -Rf yenjinc Directory

『chgrp』基 礎用法:

若要使用 chgrp 更改檔案的所有權,必須擁有超級使用者的權限哦!


# chgrp [選項] [擁有群組] [檔案]
# chgrp users File.txt
# chgrp -Rf yenjinc Directory

以下是 chown、chgrp 指令的應用範例:

cyj@riemann:~$ ls -l
total 0
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:46 File1
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:46 File2
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:46 File3
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:47 File4
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:47 File5 (← 所有檔案的擁有者與群組都屬於 cyj )

cyj@riemann:~$ chown cyj:yenlung File1


chown: changing ownership of `File1': Operation not permitted
(← 以『一般使用者』身份更改檔案的所有權,結果出現『權限不足』的警告訊息)
(← 使用 chown、chgrp 更改檔案的所有權,必須擁有『超級使用者』的權限才行)

cyj@riemann:~$ su - (← 變身為 root )


Password: (← 輸入 root 密碼)
riemann:~# ls -l (← 提示字元變成了 # 號)
total 0
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:46 File1
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:46 File2
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:46 File3
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:47 File4
-rw-r--r-- 1 cyj cyj 0 Oct 16 20:47 File5

- 89 -
riemann:~# chown cyj:yenlung File1
(← 把 File1 的擁有人改為 cyj,把擁有群組改為 yenlung )

riemann:~# chown yenlung File2


(← 把 File2 的擁有人改為 yenlung )

riemann:~# chown :kkd File3


(← 把 File3 的擁有群組改為 kkd )

riemann:~# chgrp apua File4


(← 把 File4 的擁有群組改為 apua )
(← 用法等同於『chown :apua File4 』)

riemann:~# chown yenlung:apua File5


(← 把 File5 的擁有人改為 yenlung,把擁有群組改為 apua )

riemann:~# ls -l
total 0
-rw-r--r-- 1 cyj yenlung 0 Oct 16 20:46 File1
-rw-r--r-- 1 yenlung cyj 0 Oct 16 20:46 File2
-rw-r--r-- 1 cyj kkd 0 Oct 16 20:46 File3
-rw-r--r-- 1 cyj apua 0 Oct 16 20:47 File4
-rw-r--r-- 1 yenlung apua 0 Oct 16 20:47 File5
(← 驗證一下,剛才的更改動作全部都成功囉!)

riemann:~# chgrp jimyeh File*


(← 使用 chgrp 將所有 File* 檔案的擁有群組全改成 jimyeh )

riemann:~# ls -l
total 0
-rw-r--r-- 1 cyj jimyeh 0 Oct 16 20:46 File1
-rw-r--r-- 1 yenlung jimyeh 0 Oct 16 20:46 File2
-rw-r--r-- 1 cyj jimyeh 0 Oct 16 20:46 File3
-rw-r--r-- 1 cyj jimyeh 0 Oct 16 20:47 File4
-rw-r--r-- 1 yenlung jimyeh 0 Oct 16 20:47 File5
(← 驗證一下,剛才的更改動作全部成功囉!)

以上是 Linux 下『更改檔案權限』的指令介紹。另外還有較深入的


SUID、SGID 以及 Sticky 的權限概念,筆者目前尚未併入講義當中。假使
各位對於細節有興趣,不妨參考以下資源。

- 90 -
相關資源:

『鳥哥的私房菜—Linux的檔案權限概念』
— http://linux.vbird.org/linux_basic/0210filepermission.php#filepermission

『鳥哥的私房菜—檔案與目錄的預設權限與隱藏權限』
— http://linux.vbird.org/linux_basic/0220filemanager.php#fileperm

- 91 -
7-4 搜尋檔案

這一章節裡,筆者要介紹幾個常用的 UNIX 搜尋檔案的工具。這些搜尋


的工具分成兩個部份,筆者把它們整理列表如下:

尋找系統檔案
find 搜尋系統中的檔案
locate 搜尋系統中的檔案 (透過已整理的資料庫)
查詢指令相關檔案
whereis 搜尋指令名稱的相關檔案
which 搜尋指令名稱所存在的位置 (根據 PATH)
type 查詢指令名稱所存在的位置以及種類

『find』與『locate』都是用來搜尋系統檔案的工具,不過它們的搜尋
方式不太一樣。find 是直接從 File System 來搜尋檔案,因此搜尋速度會比
較慢一些,也比較耗費系統資源;locate 的搜尋方式,是透過一個已經對
File System 索引 (index) 過後的資料庫來尋找檔案,因此 locate 的速度
會較快些,也比較不會耗費系統資源。不過在使用 locate 之前,要先使用
『updatedb』指令,來建立『檔案索引資料庫』。以下是 find 與 locate
搜尋檔案的示意圖,讓大家了解其中的差異。

『find、locate』搜 尋檔案示意圖 :

Linux
find 直接到 File System 搜尋

File
System
locate
updatedb
由 updatedb 指令建立索引,
從索引資料庫來搜尋檔案。

- 92 -
這兩個指令的使用方式,筆者由下方的範例來為各位介紹。

查看一下『find』的 manpage:

cyj@debian:~$ man find (看 find 的 manpage )


以下筆者將會舉例示範的部份節錄出來

NAME
find - search for files in a directory hierarchy

SYNOPSIS
find [path...] [expression]

EXPRESSIONS
The expression is made up of options (which affect overall operation
rather than the processing of a specific file, and always return true),
tests (which return a true or false value), and actions (which have
side effects and return a true or false value), all separated by opera-
tors.

OPTIONS (TESTS and ACTIONS)

-amin n
File was last accessed n minutes ago.

-atime n
File was last accessed n*24 hours ago.

-cmin n
File's status was last changed n minutes ago.

-ctime n
File's status was last changed n*24 hours ago.

-mmin n
File's data was last modified n minutes ago.

-mtime n
File's data was last modified n*24 hours ago.

-name pattern
Base of file name (the path with the leading directories
removed) matches shell pattern pattern.

- 93 -
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find. Both of these
constructions might need to be escaped (with a `\') or quoted to
protect them from expansion by the shell. The command is exe-
cuted in the starting directory.

備註:
find 的 manpage 相當重要,若各位有興趣不妨親自查看,並練習操作。
以上這些介紹內容僅擷取下列會舉例示範的部份而已。

『find』基礎用法 :

find 指令的使用方式
$ find [目錄] [選項] 要搜尋的字串 [要執行的動作]
$ find /home -name "yenjinc.info"
$ find /home -name "yenjinc.info" -exec rm {} \;

接著我們來看 find 指令的實際操作範例:

使用 find 搜尋檔案:

一個典型的搜尋檔案的範例

cyj@debian:~$ ls -l
total 24
drwxr-xr-x 2 cyj cyj 4096 Aug 7 13:49 File
drwxr-xr-x 9 cyj cyj 4096 Aug 17 15:57 Project
drwxr-xr-x 2 cyj cyj 4096 Aug 13 09:40 bin
drwxr-xr-x 2 cyj cyj 4096 Aug 13 11:33 conf

cyj@debian:~$ find . -name "Test.txt" (← 搜尋目錄下名稱為 Test.txt 的檔案)


./Project/ssh/Test.txt (← 列示出找到的檔案)

- 94 -
搜尋檔案並執行相關的動作 ( –exec ):

cyj@debian:~$ find . -name "Test.txt" (← 搜尋目錄下名稱為 Test.txt 的檔案)


./Project/ssh/Test.txt (← 找到 Test.txt 在 ./Project/ssh/ 中)

cyj@debian:~$ find . -name "Test.txt" -exec rm {} \;


(←『–exec 』表示在搜尋之後『要執行動作』)
(←『rm』為刪除檔案的指令)
(←『{}』表示搜尋到的檔案 Test.txt )
(←『\;』表示此動作的結束)

此例子為:找到 Test.txt 檔案之後,執行 rm 的動作。


換句話說,就是『刪除』所找到的檔案。

驗證一下:
cyj@debian:~$ find . -name "Test.txt"
(← 由於 Test.txt 已經被刪除,所以搜尋不到囉!)

搜尋『幾天前』變更的檔案 ( –atime、–ctime、–mtime ):

節錄 –atime、–ctime、–mtime 的說明

cyj@debian:~$ man find


Reformatting find(1), please wait...

-atime n
File was last accessed n*24 hours ago.
(Access: 表示 "存取、Read" )

-ctime n
File's status was last changed n*24 hours ago.
(Change: 改變過狀態,例如: "改名、修改權限" 等)

-mtime n
File's data was last modified n*24 hours ago.
(Modify: 表示 "修改過內容" )

以下為實際應用示範:

- 95 -
cyj@debian:/$ cd / (← 切換到根目錄下)
cyj@debian:/$ date (← 使用 date 查看目前的日期與時間)
Tue Oct 17 21:38:47 CST 2006 (← 2006年10月17日)

cyj@debian:/$ su - (← 接下來的操作需要用到 root 權限)


Password: (← 變身為 root )

debian:~# find /var -mtime 10 -exec ls -l {} \;


-rw------- 1 root root 2477 Oct 7 07:55 /var/log/vsftpd.log.2
(← 針對 /var 目錄找出 10天之前任何有『修改過』的檔案)
(← -exec 執行 ls –l 動作,將查詢結果顯示出來)
(← 確實符合 -mtime 10 的搜尋條件)

debian:~# find /var -atime 5 -exec ls -l {} \;


-rw-r----- 1 Debian-exim adm 677 Oct 12 06:25 /var/log/exim4/mainlog.7.gz
-rw-r----- 1 root adm 851 Oct 13 06:25 /var/log/syslog.4.gz
-rw-rw---- 1 mysql adm 887461 Oct 13 06:25 /var/log/mysql/mysql-bin.073
-rw-r----- 1 root adm 20 Oct 12 06:25 /var/log/mysql.err.6.gz
-rw-r----- 1 mysql adm 20 Oct 12 06:25 /var/log/mysql.log.6.gz
-rw-rw---- 1 apua mail 0 Oct 12 12:22 /var/mail/apua
(← 針對 /var 目錄找出 5天之前任何有『存取過』的檔案)
(← -exec 執行 ls –l 動作,將查詢結果顯示出來)
(← 確實符合 -atime 5 的搜尋條件)

debian:~# find /var -ctime 1 -exec ls -l {} \;


-r--r--r-- 1 root root 79856 Oct 16 06:25 /var/log/ksymoops/20061016.ksyms
-r--r--r-- 1 root root 985 Oct 16 06:25 /var/log/ksymoops/20061016.modules
-rw-r----- 1 root adm 6689 Oct 16 08:32 /var/log/apache-ssl/error.log
-rw-rw---- 1 mysql adm 450785 Oct 16 06:25 /var/log/mysql/mysql-bin.076
-rw------- 1 root root 689 Oct 15 22:10 /var/log/vsftpd.log
(← 針對 /var 目錄找出 1天之前任何有『改變過狀態』的檔案)
(← -exec 執行 ls –l 動作,將查詢結果顯示出來)
(← 確實符合 -ctime 1 的搜尋條件)

搜尋『幾分鐘前』變更的檔案 ( –amin、–cmin、–mmin ):

節錄 –amin、–cmin、–mmin 的說明

cyj@debian:~$ man find

- 96 -
Reformatting find(1), please wait...

-amin n
File was last accessed n minutes ago.
(Access: 表示 "存取"、Read" )

-cmin n
File's status was last changed n minutes ago.
(Change: 改變過狀態,例如: "改名、修改權限" 等)

-mmin n
File's data was last modified n minutes ago.
(Modify: 表示 "修改過內容" )

-amin、-cmin、-mmin 的使用方式與剛才 -atime、-ctime、-mtime 大致上相同。


若各位有興趣,不妨 cd 到 /tmp 目錄下,利用 find 加上這些選項來練習。

以上這些是常用的 find 指令示範,假使各位親身練習過後,一定會


更加深印象的。接著我們來看另外一個指令 locate 的操作示範。

『locate』基礎用法:

locate 指令的使用方式
$ locate [要搜尋的檔案名稱]
$ locate yenjinc.info.txt

接著我們來看 locate 指令的實際操作範例:

使用 locate 搜尋檔案:

使用 locate 之前,必須先建立索引資料庫,使用 updatedb 指令:

cyj@debian:~$ sudo updatedb


(← updatedb 必須由 root 權限來執行)
(← updatedb 會建立檔案索引資料庫,並存放在 /var/cache/locate/locatedb )

- 97 -
locate 搜尋檔案範例:

cyj@debian:~$ locate passwd


/etc/passwd
/etc/passwd-
(← 找尋名稱為 passwd 的檔案)

cyj@debian:~$ locate httpd.conf


/home/cyj/LocalApps/Apache/conf/httpd.conf
/home/cyj/LocalApps/Apache/conf/original/httpd.conf
(← 找尋名稱為 httpd.conf 的檔案)

locate 的使用方式比 find 來得簡單,而且在搜尋的速度上也比較快。


若要讓『索引資料庫』的內容一直保持在最新的狀態,那麼就要定期的
updatedb,否則新建立的檔案,有可能會搜尋不到唷!這是因為 updatedb
尚未更新的原因。若使用 find 搜尋檔案,就不會有這種問題發生,這也是
locate 與 find 之間最大的差異。

以下是筆者針對上述的狀況所做的示範:

cyj@debian:~$ ls
Desktop Documents Library Movies Music Pictures Public Sites

cyj@debian:~$ touch New-File.txt


cyj@debian:~$ ls
Desktop Library Music Pictures Sites
Documents Movies New-File.txt Public
(← 建立一個新的檔案)

cyj@debian:~$ locate New-File.txt


(← 這時候使用 locate 來搜尋,居然找不到任何資料!)

cyj@debian:~$ sudo updatedb


(← 手動重新 updatedb 一次)

cyj@debian:~$ locate New-File.txt


/home/cyj/New-File.txt
(← 這時候新建立的檔案已經被索引到資料庫中了,於是可以順利找到)
(← 系統要定期 updatedb,這樣才能讓索引資料庫一直保持在最新的狀態)

- 98 -
以上是 find、locate 的基礎應用介紹。接下來要介紹各位『查詢指令
相關檔案』的搜尋工具,例如 whereis 、which、type 等。下面筆者以常用
的範例來為各位介紹這些 UNIX 工具。

查詢指令相關檔案
whereis 搜尋指令名稱的相關檔案
which 搜尋指令名稱所存在的位置 (根據 PATH)
type 查詢指令名稱所存在的位置以及種類

『whereis』基礎 用法:

whereis 指令的使用方式
$ whereis [選項] 查詢的檔案名稱
$ whereis -b man
$ whereis man

whereis 的相關選項
-b Search only for binaries.
-m Search only for manual sections.
-s Search only for sources.

『whereis』查詢 指令名稱的相 關檔 案:

cyj@debian:~$ whereis -b man


man: /usr/bin/man /usr/local/man /usr/share/man
(← 找尋有關 man 的 binary 檔案)

cyj@debian:~$ whereis -m man


man: /usr/share/man/man1/man.1.gz /usr/share/man/man7/man.7.gz
(← 找尋有關 man 的 manual 檔案)

cyj@debian:~$ whereis -s man


(← 找尋有關 man 的 source 檔案)
(← 在此沒有 man 的 source File 所以搜尋不到)

- 99 -
『which』基礎用法:

which 指令的使用方式
$ which [查詢的指令名稱]
$ which ls
$ which mkdir

『which』查詢指令檔 案的所在位置 (根據 PATH):

cyj@debian:~$ which ls
/bin/ls
(← 根據 PATH 找到 ls 所在位置為 /bin/ls)

cyj@debian:~$ which man


/usr/bin/man
(← 根據 PATH 找到 man 所在位置為 /usr/bin/man)

cyj@debian:~$ which mkdir


/bin/mkdir
(← 根據 PATH 找到 mkdir 所在位置為 /bin/mkdir)

『type』基礎用法:

type 指令的使用方式
$ type [查詢的指令名稱]
$ type mkdir

『type』查詢指令名稱所存在 的位 置以及種類 :

cyj@debian:~$ type man


man is hashed (/usr/bin/man)
(← 查詢的結果表示,man 在 /usr/bin/man)

- 100 -
cyj@debian:~$ type mkdir
mkdir is /bin/mkdir
(← 查詢的結果表示,mkdir 在 /bin/mkdir)

cyj@debian:~$ type cd
cd is a shell builtin
(← 查詢的結果表示,cd 是 shell 內建的指令)

cyj@debian:~$ type ls
ls is aliased to `ls --color=auto'
(← 查詢的結果表示,ls 是一個『Alias』其內容是『ls --color=auto』)

以上是本章節『搜尋檔案』的範例介紹,在 Linux / UNIX 系統中


,『檔案搜尋』也是一個重要的課題,以上只是初淺的應用範例而已,更多
的應用與細節,各位不妨可以參考下列資源。

相關資源:

『鳥哥的私房菜 — 檔案搜尋』
— http://linux.vbird.org/linux_basic/0220filemanager.php#file_find

『柏青哥的 SuSE Linux — 檔案搜尋』


— http://paching.myweb.hinet.net/lesson5.htm#49

- 101 -
7-5 文字過濾器

在 Linux 上有許多命令可以用來『擷取檔案字串內容』。這些命令必
須透過 PipeLine (管線) 來處理,所以有人稱之為『管線命令』,另外的一
種稱呼也叫做『文字過濾器 (Text Stream Filter)』。這類命令會將檔案文
字的內容,依照使用者的需求『修整』後,將結果送往標準輸出或存入檔案
中,甚至還能透過 pipeline 再把結果交由下一個文字過濾器來處理。常見的
文字過濾器,例如有下列這些 (僅列出一些,仍有許多尚未列出):

grep print lines matching a pattern


cut remove sections from each line of files
head output the first part of files
tail output the last part of files
wc print the number of newlines, words, and bytes in files
sort sort lines of text files
nl number lines of files
uniq remove duplicate lines from a sorted file
join join lines of two files on a common field
paste merge lines of files
tr translate or delete characters
sed Sed is a stream editor
awk Pattern scanning and text processing language

在這裡筆者暫時先介紹 grep 以及 head、tail,其他的留作補充資源


給各位參考。我們首先來看 grep 的介紹,譬如筆者要搜尋系統全部的純文
字檔,並找出『哪一個』檔案的內文中有『yenjinc.info』這幾個字串,那
麼我該如何處理呢?

這時候就需要使用『grep』這個工具來搜尋了!我們先來看一下 grep
的 manpage。

- 102 -
查看一下『grep』的 manpage:

cyj@debian:~$ man grep (看 grep 的 manpage )


以下筆者將會舉例示範的部份節錄出來

NAME
grep, egrep, fgrep, rgrep - print lines matching a pattern

SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

DESCRIPTION
Grep searches the named input FILEs (or standard input if no files are
named, or the file name - is given) for lines containing a match to the
given PATTERN. By default, grep prints the matching lines.
In addition, three variant programs egrep, fgrep and rgrep are avail-
able. Egrep is the same as grep -E. Fgrep is the same as grep -F.
Rgrep is the same as grep -r.

OPTIONS

-H, --with-filename
Print the filename for each match.

-n, --line-number
Prefix each line of output with the line number within its input
file.

-v, --invert-match
Invert the sense of matching, to select non-matching lines.

『grep』基本 用法:

grep 指令的使用方式
$ grep [選項] 相關字串 [檔案]
$ grep "yenjinc" /
$ grep -n "Denny" /etc/passwd

- 103 -
『grep』基本 應用範例:

cyj@riemann:~$ grep cyj /etc/passwd


cyj:x:1000:1000:,,,:/home/cyj:/bin/bash
(← 直接找尋 /etc/passwd 中有關 cyj 的字串)

cyj@riemann:~$ cat /etc/passwd | grep cyj


cyj:x:1000:1000:,,,:/home/cyj:/bin/bash
(← 相同的例子,不過這裡是採用 cat + pipeline + grep 的方式)

cyj@riemann:~$ grep -n yenlung /etc/passwd


25:yenlung:x:1003:1003:,,,:/home/yenlung:/bin/bash
(←『-n』將找到的行數以及內容都標示出來)
(← yenlung 出現在檔案的第 25 行)

cyj@riemann:~$ grep -n false /etc/passwd


19:Debian-exim:x:102:102::/var/spool/exim4:/bin/false
21:identd:x:100:65534::/var/run/identd:/bin/false
22:sshd:x:101:65534::/var/run/sshd:/bin/false
(← 相同的例子,將含有 false 字串的內容與行數都列出來)

cyj@riemann:~$ grep -v sh /etc/passwd


sync:x:4:65534:sync:/bin:/bin/sync
Debian-exim:x:102:102::/var/spool/exim4:/bin/false
identd:x:100:65534::/var/run/identd:/bin/false
(←『-v』表示『反向搜尋』,也就是『不要顯示』的意思)
(← 將 /etc/passwd 檔案中,『不包含』sh 的內容都顯示出來)

『grep』日常 應用範例介紹 :

以下是筆者在日常生活中,使用 grep 的一些範例,將它們貼上來做介紹。

PowerBook-G4-12:~ Denny$ history | grep ssh | grep cyj


78 ssh cyj@140.119.175.XX
228 ssh cyj@140.119.175.XX
347 ssh cyj@140.119.175.XX
349 ssh cyj@140.119.175.XX
(←『grep』以及『pipeline』複合應用)
(← 將 history 中,包含 ssh 以及 cyj 的結果顯示出來)

- 104 -
PowerBook-G4-12:~ Denny$ history | grep ssh | grep cyj
78 ssh cyj@140.119.175.XX
228 ssh cyj@140.119.175.XX
347 ssh cyj@140.119.175.XX
349 ssh cyj@140.119.175.XX
(←『grep』以及『pipeline』複合應用)
(← 將 history 中,包含 ssh 以及 cyj 的結果顯示出來)

yenjinc@giant:~/Products$ find . -type f -exec grep -Hn "plone" {} \;


./skins/sin/sinList.pt:5: i18n:domain="plone">
./skins/sin/sinBox.pt:3: i18n:domain="plone">
./skins/sin/sincfg.pt:5: i18n:domain="plone">
./skins/sin/rss_slot.pt:5: i18n:domain="plone">
(← 使用 find 找尋所有檔案,並執行 grep 過濾內容)
(← 將內容包含有 plone 的『檔案名稱』與『行數』都標示出來)

cyj@riemann:~$ cat /boot/grub/menu.lst | grep -v ^# | grep -v ^$


default 0
timeout 5
color cyan/blue white/blue
title Debian GNU/Linux, kernel 2.4.27-2-386
root (hd0,4)
kernel /vmlinuz-2.4.27-2-386 root=/dev/hda1 ro
initrd /initrd.img-2.4.27-2-386
savedefault
boot
title Debian GNU/Linux, kernel 2.4.27-2-386 (recovery mode)
root (hd0,4)
kernel /vmlinuz-2.4.27-2-386 root=/dev/hda1 ro single
initrd /initrd.img-2.4.27-2-386
savedefault
boot
(← 針對 /boot/grub/menu.lst 來過濾檔案內容)
(← 把『以 # 為開頭』以及『空白行』統統拿掉後的結果顯示出來)
(← 這個例子使用了一些『正規表示式』,筆者在『7-7 正規表示式』會介紹)

以上是 grep 的基礎介紹,更多的詳細內容,各位可以參考:

『鳥哥的私房菜 – grep 使用介紹』


— http://linux.vbird.org/linux_basic/0330regularex.php#basic_regexp

- 105 -
接著我們來看 head 與 tail 的應用:

『head』指令應 用:

head 在不加任何選項下,預設為顯示檔案的『開頭』10行。
cyj@debian:~$ head /etc/inittab
1. # /etc/inittab: init(8) configuration.
2. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
3.
4. # The default runlevel.
5. id:2:initdefault:
6.
7. # Boot-time system configuration/initialization script.
8. # This is run first except when booting in emergency (-b) mode.
9. si::sysinit:/etc/init.d/rcS
10.

『tail』指令應用:

tail 在不加任何選項下,預設為顯示檔案的『倒數』10行。
cyj@debian:~$ tail /etc/inittab
1.
2. # Example how to put a getty on a serial line (for a terminal)
3. #
4. #T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
5. #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
6.
7. # Example how to put a getty on a modem line.
8. #
9. #T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
10.

假使我想將 /etc/inittab 的檔案內容,從第 13 行到第 18 行的內容秀


出來,該如何做呢?

cyj@debian:~$ nl /etc/inittab > TMP


(← 將 /etc/inittab 使用 nl 指令分行後,將結果儲存為 TMP 檔案)

- 106 -
cyj@debian:~$ nl /etc/inittab > TMP
(← 將 /etc/inittab 使用 nl 指令分行後,將結果儲存為 TMP 檔案)

cyj@debian:~$ head -18 TMP | tail -6


13 # Runlevel 0 is halt.
14 # Runlevel 1 is single-user.
15 # Runlevels 2-5 are multi-user.
16 # Runlevel 6 is reboot.
17 l0:0:wait:/etc/init.d/rc 0
18 l1:1:wait:/etc/init.d/rc 1
(← head、tail 與 pipeline 應用)
(← 去頭截尾的把第 13–18 行的內容擷取出來)

以上是筆者對於 grep 以及 head、tail 指令的基本介紹。這一章節中


提及的其他『文字過濾器』,筆者暫時先預留相關資源給各位參考囉!

相關資源:

『鳥哥的私房菜 — 管線命令』
— http://linux.vbird.org/linux_basic/0320bash.php#pipe

『鳥哥的私房菜 – grep 使用介紹』


— http://linux.vbird.org/linux_basic/0330regularex.php#basic_regexp

『文字過濾器 - Text Processing Commands』


— http://www.linux.com/guides/abs-guide/textproc.shtml

- 107 -
7-6 萬用字元

在 Shell 底下,擁有一些特殊符號,稱之為『萬用字元 (wild card)』


;萬用字元對於『檔名的展開』相當好用,在一些繁複的工作中,使用萬用
字元可以減少不少負擔呢!

以下是基礎的『萬用字元』字符代表意義介紹:

符號 說明
? 萬用字元,代表此處一定要有『一個字元』
* 萬用字元,代表此處可以有『0或多個字元』

Search String Files Found

File? FileA
FileB

File?? FileAa
FileBb

File* File
FileA
FileAB
FileABC
FileDenny
FileYenjin

?ile* File
file
Aile
aileA
BileABC
bile1
Cile123

接著我們來看些操作範例:

- 108 -
『萬用字元』基礎應用:

cyj@debian:~$ ls (← 目錄下有以下這些檔案)
1.mp3 12.mp3 14.mp3 16.mp3 3.mp3 5.mp3 7.mp3 9.mp3 index.txt
11.mp3 13.mp3 15.mp3 2.mp3 4.mp3 6.mp3 8.mp3 Readme.txt
install.txt

cyj@debian:~$ ls *.mp3 (← 將 *.mp3 列示出來)


1.mp3 12.mp3 14.mp3 16.mp3 3.mp3 5.mp3 7.mp3 9.mp3 11.mp3
13.mp3 15.mp3 2.mp3 4.mp3 6.mp3 8.mp3

cyj@debian:~$ ls ?.mp3 (← 將『個位數』的 mp3 檔案列示出來)


1.mp3 2.mp3 3.mp3 4.mp3 5.mp3 6.mp3 7.mp3 8.mp3 9.mp3

cyj@debian:~$ ls *.txt (← 將 *.txt 列示出來)


Readme.txt index.txt install.txt

cyj@debian:~$ ls i*.txt (← 將『 i 開頭』的 txt 檔案列示出來)


index.txt install.txt

cyj@debian:~$ ls 1?.mp3 (← 將『十位數』的 mp3 檔案列示出來)


11.mp3 12.mp3 13.mp3 14.mp3 15.mp3 16.mp3

cyj@debian:~$ ls 1*.mp3 (← 將『 1 開頭』的 mp3 檔案列示出來)


1.mp3 11.mp3 12.mp3 13.mp3 14.mp3 15.mp3 16.mp3

cyj@debian:~$ ls ??????.txt (← 將檔名共有『六個位元』的 txt 檔案列示出來)


Readme.txt

cyj@debian:~$ ls ?????.txt (← 將檔名共有『五個位元』的 txt 檔案列示出來)


index.txt

cyj@debian:~$ ls ????.txt
ls: ????.txt: No such file or directory
(← 將檔名共有『四個位元』的 txt 檔案列示出來)
(← 目錄下沒有找到符合的結果,所以出現『找不到』的訊息)

以上是簡單的萬用字元範例介紹,大家不妨也參考下面的相關資源。
接著下一章節要帶各位來認識『正規表示式』囉!

- 109 -
相關資源:

『鳥哥的私房菜—萬用字元與特殊符號』
— http://linux.vbird.org/linux_basic/0320bash.php#settings_wildcard

7-7 正規表示式

初學者對於『正規表示式』與『萬用字元』常常會搞混,因此正確的
觀念釐清是很重要的喔!『正規表示式』在 UNIX 系統中,扮演著很重要的
角色,詳細的介紹與說明可以深入到一本書的容量了。不過在這一章節裡,
筆者只先介紹基礎的入門範例,至於詳細的內容就留給各位研究與摸索囉!

以下是『正規表示式』的符號意義與常用範例介紹:

符號 說明 舉例
^ 行的開頭 ^The: 搜尋開頭為The的內容。
$ 行的結尾 End$: 搜尋結尾為End的內容。
[abc] 符合集合中的字 [abc]: 檔案中只要有 "a"、"b"、"c"
任一字即符合搜尋。
[a-z]、[A-Z] 符合集合範圍中的字 [a-z]: 符合 "a" 到 "z" 所有字元。
[A-Z]: 符合 "A" 到 "Z" 所有字元。
[0-9]: 符合 "0" 到 "9" 所有字元。
. 任何單一字元 file.: 符合 file1、file2,
但不符合 file10。
+ 一個或多個字元 [0-9]+:符合所有數字字元,表示檔
案中只要有數字即符合搜尋。
* 0個或多個表示式 file.*: 符合 file、file2、file10。
? 0個或一個表示式 file1?2:符合 file2、file12。
| 符合前面或者後面 file|File:符合 file也符合 File。

- 110 -
綜合使用 (以身份證字號為例)
[A-Z][12][0-9]{8} [P] [1] [12345678]
(男性的身份證字號)
[R] [2] [12345678]
(女性的身份證字號)

在這一章節裡,筆者只先介紹基礎的入門範例,至於詳細的內容就留給
各位研究與摸索囉!另外值得強調的是,大家不妨跟著下列參考資源的內容
來練習與操作,相信對於『正規表示式』能夠更加熟練唷!

相關資源:

『鳥哥的私房菜—正規表示法』
— http://linux.vbird.org/linux_basic/0330regularex.php

『正規表示式的入門與應用(一)』
— http://www.rtfiber.com.tw/~changyj/regex.1/index.html

『正規表示式的入門與應用(二)』
— http://www.rtfiber.com.tw/~changyj/regex.2/index.html

『正規表示式的入門與應用(三)』
— http://www.rtfiber.com.tw/~changyj/regex.3/index.html

『正規表示式(Regular Expressions) PPT』


— http://irw.ncit.edu.tw/peterju/webslide/re/

『正規表示式(Regular Expressions) PDF』


— http://hyh.mis.dwu.edu.tw/download/RHCE/%a5%bf%b3W%aa%ed%a5%dc%aak.pdf

- 111 -
第 8 章 文字編輯器
在 Linux / UNIX 系統中,大部份的檔案都是 ASCII 純文字檔,
於是若要更改系統設定或任何檔案時,就必須要有一套『文字編輯器』
來處理這些事情。在這一章,筆者要為各位介紹 vi 編輯器的使用。

vi 是一個歷久彌新的編輯器,在大部份的 UNIX 系統上,幾乎都能


看到 vi 編輯器的存在,因此學好 vi 編輯器就變成是一件很重要的事囉!
在 UNIX 系統中,與 vi 一樣廣受歡迎的另一套強大編輯器叫做 emacs。
雖然這裡將要介紹的是 vi 編輯器,不過筆者認為,若有機會不妨多學一套
編輯器是有利無害的,因為您總不能保證每台機器上都一定要有 vi 吧!

8-1 Vi 模式介紹

基本上 vi 共分為三種模式,分別是:
(1). 一般模式
(2). 編輯模式
(3). 指令列命 令模式

各位可從下圖了解各模式的作用。

Vi 模式介紹圖:
[:] [ESC] [a]、[i] Vi 編輯器畫面
啟動後的畫面
指令列 一般 編輯
模式 模式 模式 Text (內容 )

存檔 遊走 編寫內容
離開 Copy 複製
Paste 貼上 狀態列
(其他額外功能
如:搜尋、取代) 幾行, 幾列 百分比%

- 112 -
以上的三種模式,為了讓大家可以更淺顯易懂,簡單的說『編輯模 式
』是用來『key in (打字輸入資料)』的模式;『一 般模式』是用來『複製、
剪下、貼上..』以及『移動游標、遊走』的模式;『指令列 模式』是用來
『存檔、另存新檔..』等相關的模式。

當各位進入到 Vi 編輯畫面後,在畫面的最下方有一個『狀態列』
,此狀態列的右方,會即時顯示游標目前所在位置在『幾 行, 幾列』以及
游標所在位置的『百分比 %』狀態。

8-2 Vi 指令操作

了解 vi 模式概念後,接著筆者將 vi 常用的指令整理成下列表格給
各位參考。建議大家不妨一邊看講義一邊跟著實際練習看看,由於 vi 本身
是編輯器的關係,於是筆者比較難以用『應用示範』來為各位解說,所以
『實機操作』就留給各位親自操刀囉!

以下是常用的 Vi 指令整理列表:

游標移動按鍵:

h j k l
《左》 《下》 《上》 《右》

編輯 (插入) 模式
[i] 從『目前位置』開始編輯
[I] 從『行首』開始編輯
[a] 從『下個字元』開始編輯
[A] 從『行尾』開始編輯

- 113 -
[o] 產生『下一行』空白行
[O] 在『游標位置』建立空白行
[ESC] 切換回『一般模式』
一般模式
[0] 到『行首』
[ 1G ] 到『檔頭』
[$] 到『行尾』
[G] 到『檔尾』
[w] 跳到『下一個字』
[x] 刪除『目前游標字元』
[X] 刪除『游標前一個字元』
[ NUM ] + [十] 往下『NUM』行
[ NUM ] + [—] 往上『NUM』行
[:] + [ NUM ] 跳到『NUM』行
[v] 選取範圍
[ Ctrl ] + [ v ] 區塊選取
[y] 複製
[y][y] 複製一整行
[d] 刪除
[d][d] 刪除一整行
[d][0] 刪除至『行首』
[d][$] 刪除至『行尾』
[ d ] [ 1G ] 刪除至『檔頭』
[d][G] 刪除至『檔尾』
[ NUM ] + [..] + [..] 例如: [3] + [d] + [d] 刪除三行
[..] + [ NUM ] + [..] 例如: [d] + [3] + [w] 刪除三個字
[x] 剪下 / 刪除
[p] 貼上
[u] 將字母『換成小寫』
[U] 將字母『換成大寫』
[~] 將字母『大小寫互換』

- 114 -
[ r] 取代『一個』字元
[ R] 『連續』取代
[ u] 『復原』上一個動作
[ Ctrl ] + [ r ] 『取消復原』 (重作的意思)
分頁編輯
[ Ctrl ] + [ w ] + [n] 建立新分頁
[ Ctrl ] + [ w ] + [↑] 切換到『上方分頁』
[ Ctrl ] + [ w ] + [↓] 切換到『下方分頁』
[ Ctrl ] + [ w ] + [q] 關閉所在分頁
指令列模式
[:][e] 編輯新檔
[:][w] 儲存檔案
[:][w][q] 儲存檔案後離開 (也可以使用『:x』或『ZZ』)
[ : ] [ w ] [ q ] [!] 『強制』儲存檔案後離開 (!表示『強制』之意)
[:][q] 不儲存離開
[ : ] [ q ] [!] 『強制』不儲存離開
搜尋與取代
[/] 向下搜尋 ( N 切換至上一個,n 切換至下一個)
[?] 向上搜尋 ( N 切換至上一個,n 切換至下一個)
: s/[old]/[new]/g 將所有的 [old] 替換成 [new]
:1,30s/[old]/[new]/g 將『第一行』至『第三十行』的 [old] 替換成 [new]
:1,$s/[old]/[new]/g 將『整個檔案』的 [old] 替換成 [new]
:1,$s/^/ /g 將『檔案的開頭』都往後移四個空白 (用於排版用)
[ Ctrl ] + A 自動將數字累加

以上都是基礎常用的編輯方法,基本上熟悉這些用法後,應該就沒有什
麼大問題囉! vi 編輯器的使用也是一門重要的課題,以下筆者列整一些網路
教學文章給各位參考。

- 115 -
相關資源:

『鳥哥的私房菜—Vi文書處理器』
— http://linux.vbird.org/linux_basic/0310vi.php

『大家來學 Vim —一個歷久彌新的編輯器』


— http://www.study-area.org/tips/vim/index.html

『Vi 使令說明完整版』
— http://www2.nsysu.edu.tw/csmlab/unix/vi_command.htm

『Vi 完全小抄 PDF 版』


— http://tnerual.eriogerg.free.fr/vimqrc.pdf

『Vi 小抄 手工版』
— http://www.artweb-design.de/articles/2006/04/15/learning-by-cheating-finally-got-used-to-use-vim

『Vi 手工小抄完整版』
— http://www.gentoo.org/doc/zh_tw/vi-guide.xml

『Vi 小抄之彩色鍵盤版』
— http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html

『Vi 小抄之彩色鍵盤版 (繁體中文版)』


— http://jserv.sayya.org/misc/vi-vim-cheat-sheet.png

- 116 -
Linux 基礎管理

第 9 章 帳號管理
9-1 使用者與群組概念

使用者與群組概念

- 117 -
9-2 相關設定檔

相關設定檔

- 118 -
9-3 基本指令操作

基本指令操作

- 119 -
第 10 章 套件管理
10-1 背景知識

背景知識

- 120 -
10-2 套件管理工具

套件管理工具

- 121 -
10-3 原始碼安裝軟體

原始碼安裝軟體

- 122 -
10-4 手動安裝 (一)

手動安裝

- 123 -
10-5 手動安裝 (二)

手動安裝

- 124 -
第 11 章 行程管理
11-1 背景與前景工作

背景與前景工作

- 125 -
11-2 基本指令操作

基本指令操作

- 126 -
第 12 章 工作排程
12-1 背景知識

背景知識

- 127 -
12-2 相關設定檔

相關設定檔

- 128 -
12-3 基本指令操作

基本指令操作

- 129 -
Linux 進階管理

第 13 章 檔案系統管理
13-1 磁碟分割與格式化

磁碟分割與格式化

13-2 檔案系統掛載

檔案系統掛載

13-3 相關設定檔

相關設定檔

13-4 相關工具使用

相關工具使用

13-5 磁碟配額

磁碟配額

- 130 -
第 14 章 系統開機流程
14-1 開機管理程式

使用者與群組概念

14-2 系統運作層級

系統運作層級

14-3 相關設定檔

相關設定檔

14-4 相關工具使用

相關工具使用

- 131 -
第 15 章 系統備份與救援
15-1 備份策略

備份策略

15-2 相關工具使用

相關工具使用

15-3 救援模式 (一)

救援模式

15-4 救援模式 (二)

救援模式

- 132 -
第 16 章 系統紀錄檢視
16-1 背景知識

背景知識

16-2 相關設定檔

相關設定檔

16-3 相關工具使用

相關工具使用

- 133 -

You might also like