第 1 堂課 - 檔案管理與 vim 初探
上次更新日期 2018/10/02
操作作業系統,最重要的當然就是從檔案管理開始!檔案管理有目錄檔案、一般檔案的分類等~另外,文書編輯器的 vim 也需要理解才行!
- 1.1: 操作習慣的建立
- 1.2: 檔案與目錄管理
- 1.3: vim 程式編輯器的使用
- 1.4: 本日練習
- 1.5: 課後練習
1.1: 操作習慣的建立
操作習慣的建立是相當重要的!可以讓你以後操作 Linux 會變得非常的簡易!幾個重要的技巧注意一下:
- 使用 [tab] 按鈕
盡量使用 [tab] 按鈕 (鍵盤最左邊的按鈕) 來補齊命令或補齊檔名[student@localhost ~]$ ifc[tab][tab] # 這就是命令補齊 [student@localhost ~]$ ll /var/sp[tab] # 這就是檔名補齊 [student@localhost ~]$ nmcli con[tab] # 這就是參數補齊
意思是,如果一切順利的話,接在第一個文字的後面,就是命令補齊,接在檔名資料的地方,就是檔名補齊,接在指令後面的某些參數, 也可以做成參數補齊的功能喔!所以,多按幾次 [tab] 按鈕,就可以知道你有沒有打錯字。 - 善用 command --help
若有看不懂的參數與指令的用法,盡量使用 command --help 的方式查詢,例如查看 date +%Y 輸出的結果,那個 %Y 的功能是什麼呢?[student@localhost ~]$ date --help
輸出的結果往下一直查詢,你就可以看到 %Y 的說明了! - 熟記 [ctrl]+c 來中斷某個程式的運作
不知道做了什麼蠢事,就用 [ctrl]+c 來終止,例如下面的範例:[student@localhost ~]$ ll '/etc/ > <==這裡按下 [ctrl]+c 來中斷吧!
另外也請記得,你能夠輸入指令的地方就只有在提示字元出現時 ($ 或 #) 才能夠輸入指令,否則應該就是在某個軟體運作當中,那就請不要隨便輸入指令喔。
- 歷史命令呼叫方式為『 history 』你使用:
- h[tab][tab]
- hi[tab][tab]
- his[tab][tab]
- 未來你要執行 history 時,可以怎麼輸入指令?
- 要找『 cal 』這個指令的說明,可以怎麼處理?
- 承上,看到語法項目寫的情況如下:
Usage: cal [options] [[[day] month] year] 選項: -1, --one show only current month (default) -3, --three show previous, current and next month -s, --sunday Sunday as first day of week -m, --monday Monday as first day of week -j, --julian output Julian dates -y, --year show whole current year -V, --version display version information and exit -h, --help display this help text and exit
注意看那個 Usage 的部份,一堆中括號的意義代表什麼?這點很重要喔!要熟記中括號的意義! - 有個指令名稱為『 cat 』,請進行如下的動作:
- 使用 cat --help 查詢意義與用法
- 輸入 cat 之後,再出現的畫面中,隨便輸入幾個字元就按下 [enter]
- 中斷離開 cat 指令
- 輸入『 cat /proc/cpu???? 』那個 ??? 是忘記檔名了!該怎麼辦?
- 同樣的,在 /proc 裡面有個 cmd 開頭的檔名,那是什麼檔名?呼叫出該檔名的內容!
- 輸入『 date +??? 』之後,可以出現『 20181001 』,意即是 YYYYMMDD (西元年月日) 的樣式,請找出來 ??? 應該為何?
1.2: 檔案與目錄管理
一般來說,我們建立的資料大多為一般檔案,包括文字檔、資料庫檔、電子試算檔、簡報檔等等。那目錄 (資料夾) 的功能是什麼? 其實目錄存在的目的是讓我們可以將檔案進行分類~例如鳥哥經常使用年份將檔案進行歸檔,這樣資料比較好搜尋!底下我們就來實做如何管理目錄、檔案等。
- 檔名與工作目錄的觀察
觀察檔名請用 ls 或 ll 來進行觀察,例如觀察家目錄下的檔名有哪些?
[student@localhost ~]$ ll
列出本目錄 (pwd) 之後,你會發現最頂端為斜線 (/),那就是根目錄,檢查根目錄下有哪些檔名?
[student@localhost ~]$ pwd /home/student (最左邊有 / ) [student@localhost ~]$ ll /
觀察到的檔名中,最左邊的字元,基本上有兩種檔案格式:
- d 開頭:該檔名為目錄檔
- - 開頭:該檔名為一般檔案
- 請問 /etc/hosts 是一般檔案還是目錄檔案?如何觀察?
- 請問 /var/spool/mail 是一般檔案還是目錄檔案?如何觀察(你應該要觀察上一層檔名才對)
- 工作目錄的切換與觀察
切換工作目錄可以使用『 cd 目錄 』來轉換,例如切換到 /dev/shm 目錄下,並列出該目錄名稱
[student@localhost ~]$ ll (記憶一下出現的資訊) [student@localhost ~]$ cd /dev/shm (切換路徑了) [student@localhost shm]$ pwd (檢查一下路徑所在) [student@localhost shm]$ ll (同樣是 ll ,跟剛剛的輸出結果為啥不同)
此時按下『 ll 』指令時,出現的資料會跟你在家目錄的資料不同。這也就是說,當你要執行任何指令動作時,可能經常得要使用 pwd 去檢查你的工作目錄才行! 否則,你的資料很可能會遺失在整個檔案系統海當中。
- 簡單的回想與說明一下,上面的範本中,為何兩次 ll 的結果會不同?
- 當直接輸入『 cd 』而已,後面不加目錄參數時,工作目錄會跑去哪個目錄?
- 目錄的建置
建立新目錄,可以使用『 mkdir 目錄名稱』,例如建立 /dev/shm/student 目錄的方法:
[student@localhost ~]$ cd /dev/shm (一般來說,我們習慣跳到底層目錄處理任務) [student@localhost shm]$ pwd (一定要確認目錄所在處) [student@localhost shm]$ mkdir student (開始建立) [student@localhost shm]$ ll (你應該會看到有出現 student 檔名才對!)
事實上,上述的範例你也可以單純的使用『 mkdir /dev/shm/student 』一行指令來處理,且在任何地方均可以執行成功。只是一般來說, 為了確認上層目錄的存在,習慣上,我們還是會先移動工作目錄到上層 (/dev/shm) 之後,再建立新目錄。
- 能否直接建立 /dev/shm/unit01/check/ 目錄?
- 若無法一個指令建立成功,你該如何處理?
- 一般檔案的複製與觀察
檔案的複製,可以使用『 cp 來源檔 目的目錄 』來處理,例如,你要將 /etc/hosts 複製到 /dev/shm/student/ 目錄下,該如何處理?
# 1. 先確認有沒有存在 /dev/shm/student [student@localhost ~]$ cd /dev/shm [student@localhost shm]$ ll (要確認存在,若不存在請 mkdir student 即可) [student@localhost shm]$ cd student (再進入子目錄當中) [student@localhost student]$ (準備輸入指令了!) # 2. 將檔案複製過來 [student@localhost student]$ ll /etc/hosts (來源檔案是否存在) [student@localhost student]$ cp /etc/hosts . (開始複製,注意參數一定有兩個以上) [student@localhost student]$ ll (做完一定要檢查!看看複製有沒有成功)
務必記得 cp (copy) 指令的參數一定有兩個以上,一個是來源,一個是目標。所以,不能是『 cp /etc/hosts 』而已!此外,複製時,你一定要檢查:
- 來源檔是否存在 (本例中就是用 ll /etc/hosts 做檢查)
- 目標目錄是否存在 (本例中就是用 cd /dev/shm/student 做處理)
等等,為什麼 cp 的參數後面不是使用 /dev/shm/student ,而是使用『 . 』呢?你覺得哪個打字比較方便?呵呵! 所以,有幾個目錄很重要,你一定要記憶一下:
- /:根目錄,所有檔案的起源
- .:本目錄的意思
- ..:上一層目錄的意思
- ~:使用者家目錄的意思思
我們經常會在網頁的超連結當中使用到 .. 或 / 就是這個路徑的功能!
- 切換工作目錄到 /dev/shm/unit01/check 當中
- 觀察 /etc/crontab (1)是否存在? (2)是否為一般檔案
- 將上述檔案複製到本目錄下,並且觀察是否複製成功
- 相同的步驟觀察 /etc/cron.d (1)是否存在? (2)是否為一般檔案
- 將上述檔案複製到本目錄下,並且觀察是否複製成功
- 檔名的絕對路徑與相對路徑
基本上,檔名的撰寫有所謂的絕對路徑與相對路徑之分。從根目錄 (/) 開始撰寫起來的檔名,在你的系統上面一定只有一個!例如 /home/student 一定只有一個, 這就是絕對路徑。但是從非根目錄撰寫起來的檔名,就是相對路徑的檔名!所謂的『相對路徑』就是相對於你工作目錄的路徑了!
# 1. 先觀察 /home/student, /student 有沒有差異? [student@localhost ~]$ ll -d /home/student [student@localhost ~]$ ll -d /student # 2. 再觀察 /dev/shm/student 與 /student 有沒有差異? [student@localhost ~]$ ll -d /dev/shm/student [student@localhost ~]$ ll -d /student # 3. 移動工作目錄到 /dev/shm 之後,觀察 /dev/shm/student 與 ./student 有沒有差異? [student@localhost ~]$ cd /dev/shm [student@localhost shm]$ ll -d /dev/shm/student [student@localhost shm]$ ll -d ./student
- 如何切換路徑到 /var/spool 去?
- 如何觀察此目錄下的所有檔名?與檔名的類型 (目錄/檔案)
- 承上,有沒有找到名為 mail 與 postfix 的檔名?另外,如何進入 mail 這個目錄?
- 觀察此目錄以及上層目錄的檔名資料
- 能不能切換路徑到剛剛看到的那個 postfix 目錄去?
- 觀察有沒沒有 /usr/local/etc 目錄的存在?若有,請切換到該目錄去,同時觀察 (1)提示字元的目錄名稱與 (2)此目錄下的檔名
- 切換路徑到 /etc 底下去,然後 (1)提示字元的目錄名稱與 (2)此目錄下的檔名
- 回到家目錄
- 目錄檔案的複製與觀察
我們剛剛在複製 /etc/cron.d 時,由於該檔名是個目錄檔,所以, cp 預設會忽略目錄,只是忽略,倒不是什麼嚴重的錯誤!別擔心! 如果想要複製目錄就得要使用『 -a 』或『 -r 』的選項,所以來處理一下剛剛的 /etc/cron.d 的複製吧!
# 1. 目標要複製到 /dev/shm/unit01/check 底下,所以,我們先切換過去該目錄: [student@localhost ~]$ cd /dev/shm/unit01/check # 2. 確認 /etc/cron.d 是檔案還是目錄 [student@localhost check]$ ll -d /etc/cron.d (-d 很重要,只觀察目標而已!不列出內部檔名) [student@localhost check]$ cp /etc/cron.d . (再做一次錯誤的) [student@localhost check]$ cp -a /etc/cron.d . (正確的做一次看看!) [student@localhost check]$ ll (你要能看到 cron.d 存在才行!)
因為我們使用一般帳號的身份,因此許多檔案複製可能有權限方面的問題,不要緊張!那是正常的!
- 先切換目錄到 /dev/shm/student 底下
- 先觀察有沒有 /etc/sysconfig 的存在,是目錄還是檔案呢?
- 開始複製!
- 複製完畢請觀察!
- 檔案的刪除行為
檔案的刪除使用 rm 來刪除喔!不過如果要刪除目錄,得要加上 -r 的選項才行!不過,刪除 rm 這個指令是很嚴重的指令!因為, Linux 跟 Windows 不一樣,你刪除之後,基本上,動作是不可逆的~也就是說,被刪除的檔案就不見了!他並不會被放置到資源回收桶! 所以,操作 rm 時,請務必小心在意!
# 1. 刪除 /dev/shm/student/hosts: (1)先確認 hosts 是存在的, (2)然後刪除他 [student@localhost student]$ cd /dev/shm/student (最好再次確認工作目錄所在) [student@localhost student]$ ll hosts (要確認有這個檔名的存在) [student@localhost student]$ rm hosts (確認無誤才刪除) [student@localhost student]$ ll (確認確實已經不存在這個檔案了才對) # 2. 嘗試刪除目錄: # 先確認 sysconfig 裡面存在 network-scripts,並且進入 sysconfig,嘗試刪除 network-scripts [student@localhost student]$ ll -d sysconfig (先確認有此目錄) [student@localhost student]$ cd sysconfig (進入此目錄吧!) [student@localhost sysconfig]$ ll (確認存在 network-scripts) [student@localhost sysconfig]$ rm network-scripts (先做一次失敗的) [student@localhost sysconfig]$ rm -r network-scripts (再做一次應該會成功的) [student@localhost sysconfig]$ ll (確認 network-scripts 不在了)
上述的動作中,請特別觀察使用『 rm 目錄』與『 rm -r 目錄』的差別。
- 進入 /dev/shm/unit01/check 目錄
- 列出所有在該目錄下的檔名,並找出一般檔案以及目錄檔案
- 刪除一般檔案
- 刪除目錄檔案
- 在列出所有檔名,看看是否已經不存在上述的檔案資料了。
1.3: vim 程式編輯器的使用
如同第 0 堂課所說的,未來我們在伺服器的角度上,大多使用純文字界面來處理 Server 的各項事物,因此,應該不會給你 gedit 這一類的圖形編輯器。 那我們如何編輯文字檔?此時就得要透過 vim 了!事實上,vim 不是文書編輯器而已,他主要是『程式編輯器』,可以透過檔案的副檔名來查看系統的語法是否正確! 他就是文字版的 notepad++ 的意思!只是,在 vim 的環境中,不要使用滑鼠,除非你要複製貼上,否則,一定不要使用滑鼠支援喔! 都是透過鍵盤來處理各項任務即可。
- 啟用 vim 的方法:『 vim filename 』
使用『 vim 檔名』就可以編輯檔案!例如再次複製 /etc/hosts 到 /dev/shm/student 之後,使用 vim hosts 查看一下該檔案的內容:
[student@localhost ~]$ cd /dev/shm/student (切換工作目錄) [student@localhost student]$ cp /etc/hosts . (複製檔案到本目錄下) [student@localhost student]$ ll (在開始之前,務必確認檔案是存在的!) [student@localhost student]$ vim hosts (編輯剛剛 ll 看到的 hosts 檔案)
畫面其實還是分為上下兩個部份的,最下方那一行是目前的狀態列!所以,實際的內容是在上頭,最後一行並不是實際的內容!要注意喔! 同時,最後一行的右邊還有一些額外的資訊可以參考!要離開這個檔案,只要按下『 :q 』就可以離開 vim 的環境了。
- vim 的三種模式狀態
一開始進入 vim 時,你進入到一般模式,在該模式下,你不能編輯文字~只能進行複製、貼上、搜尋與取代等任務,除非按下 i 或 o 才會進入編輯打字模式。 那要儲存的時候,還得要切回一般模式後,才能夠開始儲存!基本上,三種模式的關係有點像這樣:
最簡單的 vim 使用方式可以這樣說:
- 使用『 vim filename 』去打開那個 filename 的檔案 (也可以不存在)
- 你需要編輯了,按下 i 來打字 (最下方一行會顯示插入模式)
- 打字完成了,按下 [esc] 回到一般指令模式 (最下方一行的插入不見了)
- 要儲存了按下 :w 來寫入 (最下方一行顯示寫入了)
- 打字完成也儲存了,離開就按 :q 即可
讓我們來練習一下 vim 這個編輯器吧!很重要!一個簡單的練習!多練習幾次囉!
- 開啟檔案: vim hosts
- 觀察檔案: 看最底下一行,會顯示這個檔案內有幾行與幾個字元,還有游標在哪裡的資訊
- 進入編輯模式: 按下 i 之後,看最後一行左下方有沒有變成『插入 (insert)』模式,可以編輯了
- 編輯文字: 在第一行新增一段文字『 welcome to my class 』
- 離開編輯模式: 按下 [esc] 看看左下方最後一行是否已經離開插入模式
- 命令列模式: 在一般模式按下『 : 』,就是冒號,游標會移動到最後一行最左方
- 儲存: 最後一行出現『 :w 』就是儲存
- 觀察檔案資料: 按下『 :w ↵ 』之後,系統會告訴你有沒有儲存成功!
- 離開檔案: 最後一行按下『 :q↵ 』之後,就可以離開 vim 檔案了!
- 觀察檔案內容: 最終使用『 cat hosts 』看一下檔案內容, cat 不是貓,而是叫出檔案內容的指令
現在,讓我們來建立一個新檔案,在裡面建立新內容:
- 回到家目錄: cd
- 開啟新檔: vim unit01_vim.txt
- 觀察新檔案的資訊: 注意看到左下方,會告訴你是個 NEW 的新檔案
- 進入編輯模式: 按下 i 吧
- 開始編輯: 輸入你的姓名、學號等等有的沒的!
- 離開編輯模式: [esc]
- 儲存: :w
- 離開: :q
- 強制離開或強制儲存
有的時候你可能會打錯字,或者是按錯按鈕,會導致 vim 出現問題。這個時候你可以選擇不儲存離開。問題是,你更動過檔案,因此,要離開時, vim 會一直跟你說,你無法直接離開,那怎辦?
- 繼續編輯: vim unit01_vim.txt
- 進入編輯模式: i
- 直接編輯: 隨便打幾個字元
- 離開編輯模式: [esc]
- 不儲存離開: :q
- 觀察錯誤: 左下方會告訴你,可以使用 ! 強制離開的訊息!
- 強制離開: :q!
- vim 常用按鈕
在 vim 裡面有幾個常見的按鈕這裡先彙整一下~有空你可以回來這裡慢慢看!
慣用的指令 | 說明 |
i, [esc] | i 為進入編輯模式, [esc] 為離開編輯模式 |
G | 移動到這個檔案的最後一列 |
gg | 移動到這個檔案的第一列 |
dd | dd 為刪除游標所在行,5dd 為刪除 5 行,ndd 為刪除 n 行 |
yy | yy 為複製游標所在行,5yy 為複製 5 行,nyy 為複製 n 行 |
p | 在游標底下貼上剛剛刪除/複製的資料 |
u | 復原前一個動作 |
:w | 將目前的資料寫入硬碟中 |
:q | 離開 vim |
:q! | 不儲存 (強制) 離開 vim |
可以稍微了解一下,如果有大檔案的時候,要怎麼進行 vim 的游標移動
- 複製檔案: 先來到 /dev/shm/student 目錄,並將 /etc/services 複製到本目錄
- 開啟檔案: vim services
- 觀察檔案: 看左下角,這個檔案共有幾行?
- 移動游標: 將游標移動到第 2000 行,該如何移動最快
- 移動游標: 將游標移動到最後一行,然後移動到第一行,如何移動最快
- 複製資料: 將游標移動到第 2000 行,然後複製游標底下的 10 行內容
- 貼上資料: 將游標移動到第 1 行,然後貼上剛剛複製的資料
- 刪除資料: 將游標移動到第 5 行,然後刪除 3 行資料
- 儲存離開: 將資料儲存之後,離開 vim 。
1.4: 本日練習
現在來複習一下今日的動作,作為本日的點名與查驗資訊。請在目前的雲端機器上面完成底下的實做,要完成且讓老師檢查完畢後,才可以離開教室喔!
- 使用指令 help 功能,找出資訊後,將結果使用 vim 建立檔案紀錄的流程:
- 先使用 date +%Y%m%d 找出今天的日期
- 在 student 家目錄,用 vim 開啟名為 unit01.ans.txt 的檔案
- 第 1 行寫你的姓名與學號
- 第 2, 3, 4 行寫下 (或複製貼上) %Y, %m, %d 的意義
- 使用另一個終端機視窗,然後使用『 vim /etc/services 』唯讀的打開該檔案,找到第 10000 行 (查看上面的 vim 常用指令), 透過滑鼠功能,將第 10000 行與 10001 行複製之後,貼到 unit01.ans.txt 的第 6 行以後 (第 5 行保留空白)
- 完畢之後 unit01.ans.txt 儲存離開,另一個視窗則直接關閉 vim 即可。 (要確認檔名存在!且檔名要正確!)
- 目錄分類功能:
- 在 student 家目錄,建立名為 unit01/class1 unit01/class2 unit01/class3 這三個目錄
- 前往 unit01/class1 這個目錄,然後將 /etc/sysconfig 複製到本目錄下
- 前往 ~/unit01/class2 這個目錄,然後將 /etc/passwd /etc/group /etc/fstab /etc/hosts 4 個檔案複製到本目錄下
- 前往 ~/unit01/class3 這個目錄,然後將 ~/.bashrc ~/.bash_history 複製到本目錄下
- 檔案內容的新增:
- 前往 ~/unit01/class2 這個目錄
- 使用 vim 打開 fstab 這個檔案
- 在第二行新增一行,內容為『 This is 2nd time I use vim 』
- 做完之後直接儲存後離開
- 檔案的刪除
- 前往 ~/unit01/class1 目錄
- 刪除 sysconfig/cbq sysconfig/ksm sysconfig/kernel 等不必要的檔案
- 資料檢查:
- 請按右上角的設定,去啟動網路
- 使用 ifconfig 這個指令,找出你的 IP 後,告訴老師你的 IP 號碼 (例如 172.16.8.8),老師會線上檢查你是否完成作業了!
1.5: 課後練習
請撰寫一個 word 檔案,檔名為:『 unit01-A050cxxx-你的名字.docx 』,內容回答下列問題,然後每週作業上傳到對應的 EP 上面去:
- 完成底下的問題:
- 在 bash 終端機環境下, [tab] 按鈕有那三個功能?
- 如何查詢 cp 的指令參數與語法 (寫下操作指令即可)
- 如何列出歷史命令
- 如何查看 /etc/fstab 的內容?(不使用 vim 的情況下)
- 請問 /etc/crontab 與 /etc/default 分別是檔案還是目錄?
- 如何切換工作目錄到 /var/spool/postfix 去?
- 承上,如何使用相對路徑的方式,切換目錄到 /var/spool/mail 去?
- vim 實做題:
- 將 /etc/services 複製到 student 家目錄的 unit01 目錄下 (/home/student/unit01)
- 進入 unit01 目錄
- 開始編輯 services 檔案
- 第一行新增你的姓名與學號
- 將第 5~10 行刪除
- 儲存檔案
- 將畫面拍下來貼到 word 檔案上。
- 離開 vim 畫面。
- 檔案管理實做題:
- 前往 student 家目錄,並進入 unit01 的目錄內
- 建立名為 exam 的目錄,並且進入該目錄 (/home/student/unit01/exam/)
- 建立三個目錄,名稱分別為: check1 check2 check3
- 將 /etc/passwd 複製到 check1 內
- 將 /etc/cron.d 複製到 check2 內
- 將 /etc/yum.repos.d 複製到 check3 內
- 使用『 ll -R /home/student/unit01/exam 』這個指令,將指令的結果拍下來,貼上 word 檔案。
同場加映:不用上傳的資料,請 google 一下打字時,手指與鍵盤指法的對應,然後自由練習底下的資訊:
- 小寫的 a~z (abcdefg...xyz) ,共打 10 次
- 小寫的 0~9,a~z (012..89abcdefg...xyz) ,共打 10 次
- 不要啟動大寫燈,用組合按鍵輸入 A-Z (ABCD...XYZ),共 10 次
每天上課各練一次,最慢 10 天,你的打字就會嚇嚇叫了!