Linux 基礎學習訓練教材 - RockyLinux 9.x

第 3 堂課:檔案管理與 vim 初探

檔案管理的方式、檔案內容的查詢,還有最重要的 vim 運作!不過,簡單簡單講講!先熟悉為主!

最近更新時間: 2023/02/20

前一堂課讀者應該稍微接觸 Linux 檔案的管理,這一堂課我們將較深入的操作 Linux 檔案管理。 此外,本章課程亦會介紹未來將持續使用的 vim 程式編輯器,學會 vim 對於系統管理員來說,是相當重要的任務! 雖然某些時刻系統可能只會提供 vi 而已,但是,我們使用者一般操作 Linux 時,個人建議還是學會 vim 更好!

3.1:檔案管理

在 Linux 底下,所有的東西都以檔案來呈現,不同的檔案特性會有不同的結果。讀者可以常見的兩種檔案格式為:

  • 一般檔案:實際放置資料的檔案
  • 目錄檔案:重點在放置『檔名』,並沒有實際的資料

為何需要目錄檔?讀者可以想像,如果僅有一個櫃子,你將所有書籍全部丟進同一個櫃子中,則未來要找資料時,會很難找尋 (因為單品太多)。 若可以有多個櫃子,將不同的資料分類放置於各別的櫃子中,未來要找某一類別的資料,只要找到該類別的櫃子,就能夠快速的找到資料 (單品較少), 這就是目錄檔案的重點。

說實在的,不論是哪種作業系統或檔案系統,對你的資料進行分門別類的目錄/資料夾規劃,進行檔案的初次篩選,是很棒的習慣! 而且對於檔案系統的搜尋效率來說,也會比較快速!

3.1.1:目錄的建立與刪除

前一堂課已經談過,目錄的建立主要使用 mkdir 這個指令,這個指令將建立一個『空目錄』。所謂的『空目錄』意指該目錄內並沒有其他檔案的存在。 至於刪除目錄則使用 rmdir 這個指令,但同理,這個指令僅能『刪除空目錄』而已。

例題 3.1.1-1:了解基礎的工作目錄切換、觀察隱藏檔、複製檔案、刪除非空白目錄等任務。請以 student 身份完成下列動作。
  1. 前往 /dev/shm 目錄
  2. 在該目錄下建立名為 class3 的子目錄
  3. 觀察 /dev/shm/class3 這個目錄的內容,並請說明內部有沒有其他檔案 (註:使用 ll 加上顯示隱藏檔的選項)
  4. 透過 cp /etc/hosts /dev/shm/class3 將檔案複製到該目錄內,並觀察 class3 目錄的內容
  5. 使用 rmdir /dev/shm/class3 嘗試刪除該目錄,並說明可以或不行刪除該目錄的原因

使用 rm 可以刪除檔案,但預設 rm 僅能刪除一般檔案無法刪除目錄,除非加上某些選項才行。

例題 3.1.1-2:讓含有資料的目錄變成空目錄,再以 rmdir 刪除
  1. 承上一個例題,進入到 /dev/shm/class3 當中,並且使用 rm 刪除掉所有該目錄下的檔案 (非隱藏檔)
  2. 回到 /dev/shm 當中,此時能否使用 rmdir 刪除 class3 目錄?為什麼?
  • 觀察目錄本身的參數

當使用 ll dirname 時,預設會顯示出『該目錄下的檔名』,因為目錄的內容就是檔名資料。若讀者需要了解到目錄本身的資訊,而不是目錄的內容, 可以使用 -d 的選項,如下範例:

[student@localhost ~]$ ll /etc/cron.d
total 4
-rw-r--r--. 1 root root 128 Nov  1 03:55 0hourly
# 此時,你看到的上面的資料,是 /etc/cron.d 目錄內的檔名列表,並不是 cron.d 本身的狀態!

[student@localhost ~]$ ll -d /etc/cron.d
drwxr-xr-x. 2 root root 21 Feb 16 11:44 /etc/cron.d
# 這時,才是順利的顯示 cron.d 的狀態

承上,讀者可以清楚的看到有沒有加上 -d 的選項結果差異相當大。

3.1.2:萬用字元

在 bash 的環境中,要查詢某些關鍵字的資訊時,需要透過一些終端機環境下的特殊字元的支援,此即為萬用字元。經常使用的萬用字元有:

符號意義
*代表『 0 個到無窮多個』任意字元
?代表『一定有一個』任意字元
[ ]同樣代表『一定有一個在括號內』的字元(非任意字元)。例如 [abcd] 代表『一定有一個字元, 可能是 a, b, c, d 這四個任何一個』
[ - ]若有減號在中括號內時,代表『在編碼順序內的所有字元』。例如 [0-9] 代表 0 到 9 之間的所有數字,因為數字的語系編碼是連續的!
[^ ]若中括號內的第一個字元為指數符號 (^) ,那表示『反向選擇』,例如 [^abc] 代表 一定有一個字元,只要是非 a, b, c 的其他字元就接受的意思。

若讀者想要了解 /etc 底下有多少檔名開頭為 cron 的檔案時,可以使用如下的方式查詢:

[student@localhost ~]$ ll /etc/cron*
[student@localhost ~]$ ll -d /etc/cron*

如果加上 -d 的選項,則檔名會變得比較單純,但若沒有加上 -d 的選項,則 ll 會列出『許多目錄內的檔名資料』, 與預設想要了解的檔名有所差異。因此 -d 選項就顯的更為重要。

例題 3.1.2-1:使用萬用字元搭配,來找出某些特殊的檔名
  1. 列出 /etc/ 底下含有 5 個字元的檔名
  2. 列出 /etc/ 底下含有數字在內的檔名

3.1.3:檔案及目錄的複製與刪除

前一堂課也稍微介紹過複製,複製主要使用 cp 來處理,相關的選項請自行 man cp 來查詢。 預設 cp 僅複製檔案,並不會複製目錄,若需要複製目錄,一般建議直接加上 -r ,而如果是需要完整備份,則最好加上 -a 的選項為宜。 至於為何是 -a,也請自行 man cp 喔!

另外,除了正常的一般檔案與目錄檔案之外,系統也經常會有連結檔的情況出現,例如底下的資料:

[student@localhost ~]$ ll /etc/rc.local /etc/rc.d/rc.local
-rw-r--r--. 1 root root 474 Nov 15 18:18 /etc/rc.d/rc.local
lrwxrwxrwx. 1 root root  13 Nov 15 18:18 /etc/rc.local -> rc.d/rc.local

連結檔的特色是,該行開頭的 10 個字元最左邊為 l (link) ,一般檔案為減號 (-) 而目錄檔為 d (directory)。 如上表所示,其實 /etc/rc.local 與 /etc/rc.d/rc.local 是相同的資料,其中 /etc/rc.local 是連結檔,而原始檔為 /etc/rc.d/rc.local。 此時讀者需要注意,亦即當你開啟 /etc/rc.local 時,代表實際編輯 /etc/rc.d/rc.local 那個檔案的意思。

  • 複製目錄時

一般來說,複製目錄需要加上 -r 或 -a,兩者的差異如下:

# 先理解複製連結檔需要注意的事項:
[student@localhost ~]$ cd /dev/shm
[student@localhost shm]$ ll /var
drwxr-xr-x. 13 root root 4096 Feb 20 00:30 log
lrwxrwxrwx.  1 root root   10 May 16  2022 mail -> spool/mail
drwxr-xr-x.  2 root root    6 May 16  2022 nis
....

[student@localhost shm]$ cp -r /var/mail .
[student@localhost shm]$ ll
lrwxrwxrwx. 1 student student  10 Feb 20 10:38 mail -> spool/mail
# 由於這個 /var/mail 連結到的是一個目錄檔,因此,當你複製時,若結尾沒有加上 / 的話,
# 就會像這個案例一樣,你只是複製連結檔本身,而不是原本實際的資料。

[student@localhost shm]$ rm mail
[student@localhost shm]$ cp -r /var/mail/ .  <==結尾一定要加上斜線 /
[student@localhost shm]$ ll
drwxr-xr-x. 2 student student  60 Feb 20 10:41 mail   <==這樣就複製過來了。

# 查看使用 -r 複製時,兩個目錄間的差異:
[student@localhost shm]$ ll mail /var/mail/
mail:
total 0
-rw-r-----. 1 student student 0 Feb 20 10:41 student

/var/mail/:
total 0
-rw-rw----. 1 student mail 0 Feb 16 11:51 student
# 因為我們用一般帳號嘗試複製,所以權限不同還 OK。問題是,怎麼連檔案的時間也不同?

# 測試 -a 複製時,嘗試複製權限的行為狀態:
[student@localhost shm]$ cp -a /var/mail/ mail2
[student@localhost shm]$ ll mail2
-rw-rw----. 1 student student 0 Feb 16 11:51 student
# 看起來時間參數就跟原本的相同了。

讀者可以發現 -a 時,連同檔案的時間也都複製過來,而不是使用目前的時間來建立新的檔案。此外,如果以 root 的身份來執行上述指令時, 則連同權限 (前面的 root 變成 student) 也會跟原始檔案相同!這就是 -r 與 -a 的差異。因此,當系統備份時,還是建議使用 -a 的。

  • 目標檔案的存在與否

當你使用 cp 進行複製時,先來查看一下 cp --help 的語法說明:

[student@localhost ~]$ cp --help
用法:cp [選項]... [-T] 來源 目的地
  或:cp [選項]... 來源... 目錄
  或:cp [選項]... -t 目錄 來源...
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
......

在基本的語法當中,如果來源只有一個,那麼目的地就不限制是檔案或目錄。如果來源有多個,那麼最後的目的地就一定要是目錄。 那如果加上 -t 呢,則必需要來源與目標的順序對調...這個作法也相當有趣,我們可以查看一下底下的範例來理解『目的地』是檔案或目錄時的差異。

例題 3.1.3-1:目的地的目錄是否存在,會影響到複製的行為。
  1. 先進入 /dev/shm ,同時觀察目錄下有無名為 rc.d 的檔名
  2. 使用『 cp -r /etc/rc.d rc.d 』將 rc.d 複製到本目錄下,然後使用 ll 與 ll rc.d 觀察該目錄
  3. 重新執行上述複製的指令一次,然後使用 ll rc.d ,觀察一下有什麼變化?

當複製目錄,且目標為未存在的目錄,則系統會建立一個同名的目錄名稱來存放資料。但若目標檔案已存在, 則原始目錄將會被放置到目標檔案內,因此目標目錄是否存在,會影響到複製的結果

  • 刪除檔案

刪除檔案使用 rm,其中需要特別注意,不要隨便使用 rm - rf 這樣的選項,因為 -r 為刪除目錄, -f 為不詢問直接刪除, 因此若後續的檔名寫錯時,將會有相當大的影響 (一般來說,檔案刪除是無法救援回來的)。

例題 3.1.3-2:刪除的實驗
  1. 進入 /dev/shm ,觀察到前一個例題 /dev/shm/rc.d 的目錄存在後,請將它刪除

3.1.4:特殊檔名的處理方式

在 windows 底下經常會有比較特別的檔名出現,最常出現者為檔名含空白字元的情況。由於指令操作行為下,空白鍵亦為特殊字元, 因此操作上需要將這些特殊字元改為一般字元後,方可進行處理。常見的處理方式有這些情況:

  • 空白字元的檔名

一般可以使用單引號或雙引號或反斜線 (\) 來處理這樣的檔名。例如建立一個名為『 class one 』的檔名時,可以這樣做:

[student@localhost ~]$ cd /dev/shm
[student@localhost shm]$ mkdir "class one"
[student@localhost shm]$ ll
drwxr-xr-x. 2 student student 40 Feb 20 10:50 'class one'

RockyLinux 9 很特別,在有特殊檔名的狀態下,會主動的在檔名左右兩側加上單引號~不過,這只是顯示的狀態而已, 事實上,這個檔名其實是沒有單引號的喔!不要被 ll 的結果誤導了。

讀者可以發現最右邊出現了 class one 的檔名,但這個檔名要如何刪除呢?

[student@localhost shm]$ rmdir class one
rmdir: failed to remove ‘class’: 沒有此一檔案或目錄
rmdir: failed to remove ‘one’: 沒有此一檔案或目錄

[student@localhost shm]$ rmdir class\ one
# 其實,使用『 rmdir cla[tab] 』就可以讓 bash 自動幫你將檔名補齊喔!

如果僅單純的補上檔名,則 rmdir 會誤判有兩個名為 class 與 one 的目錄要刪除,因為找不到,所以回報錯誤。此時你可以使用成對雙引號或單引號來處理, 也可以透過反斜線將空白變成一般字元即可 (其實透過按下 [tab] 按鈕也可以找到上述的方式來刪除!)

  • 加號與減號開頭的檔名

讀者應該知道指令下達時,在指令後的選項為開頭是 + 或 - 的項目,如果檔名被要求建立成 -newdir 時,該如何處理?

[student@localhost shm]$ mkdir -newdir
mkdir: 不適用的選項 -- n
Try 'mkdir --help' for more information.

此時會回報錯誤,若嘗試使用單引號來處理時,同樣回報錯誤!使用反斜線,同樣回報錯誤。是否無法建立此類檔名呢? 其實讀者可以透過『絕對/相對路徑』的作法來處理,例如:

[student@localhost shm]$ mkdir /dev/shm/-newdir  <==這是絕對路徑檔名
[student@localhost shm]$ mkdir ./-newdir2        <==這是相對路徑檔名
[student@localhost shm]$ ll -d ./*new*
drwxr-xr-x. 2 student student 40 Feb 20 10:52 ./-newdir
drwxr-xr-x. 2 student student 40 Feb 20 10:52 ./-newdir2

這樣就可以建立開頭為 + 或 - 的檔名。刪除同樣得要使用這樣的檔名撰寫方式來處理。

例題 3.1.4-1:刪除特殊的檔名
  1. 使用 rm --help 查詢一下,是否有關於檔名為 - 開頭的處理模式?
  2. 將剛剛建立的 -newdir, -newdir2 刪除

3.1.5:隱藏檔的觀察與檔案類型的觀察

  • 觀察隱藏檔案

要觀察隱藏檔時,可以使用如下的方式來處理:

# 預設情境,亦即不顯示隱藏檔
[student@localhost shm]$ cd
[student@localhost ~]$ ll
total 8
drwxr-xr-x. 2 student student   6 Feb 17 13:49 Desktop
drwxr-xr-x. 2 student student   6 Feb 17 13:49 Documents
drwxr-xr-x. 2 student student   6 Feb 17 13:49 Downloads
.......

# 同時顯示隱藏檔與正常檔案
[student@localhost ~]$ ll -a
total 40
drwx------. 14 student student 4096 Feb 19 22:08 .
drwxr-xr-x.  3 root    root      21 Feb 16 11:51 ..
-rw-------.  1 student student 2883 Feb 19 23:05 .bash_history
-rw-r--r--.  1 student student   18 Nov  2 00:47 .bash_logout
-rw-r--r--.  1 student student  141 Nov  2 00:47 .bash_profile
.......

# 特殊情境,只會顯示隱藏檔
[student@localhost ~]$ ll -d .*

由於隱藏檔是檔名開頭為小數點的檔名,因此可以透過 -a 來查詢所有的檔案,或者是透過 .* 來找隱藏檔而已。 不過得要加上 -d 的選項才行,否則會連同一堆目錄內容也被抓出來,畫面就太亂了。

  • 觀察檔案的類型

但如果需要觀察檔案的類型與型態,就需要使用 file 這個指令來觀察。例如分別找出 /etc/passwd 即 /usr/bin/passwd 這兩個檔案的格式為何?

[student@localhost ~]$ ll /etc/passwd /usr/bin/passwd
-rw-r--r--. 1 root root  2098 Feb 16 11:51 /etc/passwd
-rwsr-xr-x. 1 root root 32656 May 15  2022 /usr/bin/passwd

[student@localhost ~]$ file /etc/passwd /usr/bin/passwd
/etc/passwd:     ASCII text
/usr/bin/passwd: setuid ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), 
 dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
 BuildID[sha1]=3e7d2823ae1f6faa96ad82397a23238094040086, for GNU/Linux 3.2.0, stripped

讀者即可知道這兩個檔案分別是文字檔 (ASCII text) 及執行檔 (ELF 64-bit LSB...)。

例題 3.1.5-1:查詢檔案的類型
  1. 觀察 /var/mail , /var/spool/mail , /dev/null , /dev/vda 的檔案類型為何?

3.1.6:檔名的移動與更名

若檔案建立到錯誤的位置時,可以使用 mv 來處理。同時若檔名鍵錯,也能夠使用 mv 來更名。

例題 3.1.6-1:如何進行檔案的更名
  1. 讓 student 回到家目錄
  2. 將 /etc/rpm 複製到本目錄
  3. 該目錄移動錯誤,請將本目錄的 rpm 移動到 /dev/shm
  4. 檔名依舊錯誤,請將 /dev/shm 底下的 rpm 更名為 mail3

3.1.7:大量建置空白檔案的方式

有時候為了測試系統,管理員可能需要建立許多的檔名來測試,此時可以透過 touch 這個指令來處理。例如到 /dev/shm 建立名為 testdir 與 testfile 兩個『目錄檔與一般檔』, 可以這樣處理。

[student@localhost ~]$ cd /dev/shm
[student@localhost shm]$ mkdir testdir
[student@localhost shm]$ touch testfile
[student@localhost shm]$ ll -d test*
drwxr-xr-x. 2 student student 40 Feb 20 11:04 testdir
-rw-r--r--. 1 student student  0 Feb 20 11:04 testfile

如果需要建立較多的檔名,例如 test1, test2, test3, test4 時,可以透過大括號的方式來處理。例如在 /dev/shm 底下建立上述的四個檔案,可以這樣處理:

[student@localhost shm]$ touch test{1,2,3,4}
[student@localhost shm]$ ll -d test?
-rw-r--r--. 1 student student 0 Feb 20 11:05 test1
-rw-r--r--. 1 student student 0 Feb 20 11:05 test2
-rw-r--r--. 1 student student 0 Feb 20 11:05 test3
-rw-r--r--. 1 student student 0 Feb 20 11:05 test4

如果所需要的檔名或輸出資訊是有用到連續數字時,假設由 1 到 10 這組數字,雖然能使用 {1,2,3,4,5,6,7,8,9,10} 來處理,然而輸入太繁瑣。 此時可以使用 {1..10} 來取代上述的輸出。若需要輸出 01, 02 這樣的字樣 {01..10} 來處理。

例題 3.1.7-1:大量建置檔案的方法,透過 {} 的輔助
  1. 我需要在 /dev/shm/testing 目錄下建立名為 mytest_XX_YY_ZZ 的檔案,其中 XX 為 jan, feb, mar, apr 四個資料, YY 為 one, two, three 三個資料,而 ZZ 為 a1, b1, c1 三個資料,如何使用一個指令就建立出上述的 36 個檔案?
  2. 我需要在 /dev/shm/student/ 目錄下,建立檔名為 4XXXC001 到 4XXXC050 的檔案,如何使用一個指令來完成這 50 個檔案的建置?

3.2:檔案內容的查詢

很多時候管理員只是需要知道檔案內容,並沒有進行編輯。此時可以透過一些簡易的指令來查詢文件檔案的內容。

3.2.1:連續輸出檔案內容

最簡單的查詢檔案內容的方式為透過 cat, head 與 tail 等指令。cat 為較常用的指令,但是 cat 會將檔案完整的重現在螢幕上, 因此若管理員想要查詢最後幾行時,以 tail 指令查詢會較佳。

  • cat:將檔案內容全部列出
  • head:預設只列出檔案最前面 10 行
  • tail:預設只列出檔案最後面 10 行
例題 3.2.1-1:用不同的指令查詢檔案的內容
  1. 列出 /etc/hosts 檔案的內容
  2. 列出 /etc/profile 檔案的內容
  3. 承上,第二次列出 /etc/profile 時加上行號輸出
  4. 讀者僅須列出 /etc/profile 的最前面 10 行
  5. 讀者僅須列出 /etc/passwd 最後面 10 行的內容
  6. 讀者僅須列出 /etc/services 最後 5 行的內容

3.2.2:可檢索檔案內容

上述的 cat/head/tail 需要查詢資料時,得要人工眼力查詢,因此,如果資料量比較大,而且需要查詢資訊時,可以透過 more 與 less 來處置。 more 預設會一頁一頁向後翻動,而 less 則可以向前、向後翻頁,事實上, man page 就是呼叫 less 指令的函數處理的方式。

more 軟體內常用指令:

  • /關鍵字:可以查詢關鍵字
  • 空白鍵:可以向下/向後翻頁
  • q:結束離開不再查詢文件

less 軟體內常用指令:

  • /關鍵字:可以查詢關鍵字
  • 空白鍵:可以向下/向後翻頁
  • [pageup]:可以向前/向上翻頁
  • [pagedown]:可以向下/向後翻頁
  • g:直接來到第一行
  • G:直接來到最後一行
  • q:結束離開不再查詢文件
例題 3.2.2-1:了解 more 與 less 的用法
  1. 使用 more /etc/services 一頁一頁翻動資料
  2. 承上,請找出 http 這個關鍵字,之後直接離開不再查閱
  3. 使用 less /etc/services 查詢檔案內容
  4. 承上,請找出 http 這個關鍵字,重複查詢 http 數次後,之後直接離開不再查閱

若需要查詢資料的行號時,可以透過 cat -n 配合管線命令來處理。例如,先將 /etc/services 的輸出加上行號,然後交由 less 處理,再去搜尋 http 所在行, 要執行這個指令則為:

[student@localhost ~]$ cat -n /etc/services | less

關於管線命令的使用,後續的章節會談論更多,在此讀者僅須知道在管線 (|) 之前所輸出的資訊,會傳給管線後的指令繼續讀入處理的意思。 亦即訊息資料並不是來自檔案,而是來自於前一個檔案的輸出。

3.3:vim 程式編輯器

管理員總是會需要變動系統設定檔,或者是進行純文字檔的編輯,此時就需要 vi/vim 的支援。因為 vi/vim 是 Linux 很多指令預設會去呼叫的編輯程式, 因此管理員『務必』要學會這個編輯器。另外, vim 會有顏色的支援, vi 僅為文書編輯器,故我們建議讀者們,應該要熟悉 vim 較佳。

3.3.1:簡易的 vim 操作

vim 有數種基本的模式,亦即是:

  • 一般指令模式 (command mode):使用『 vim filename 』進入 vim 之後,最先接觸到的模式。 在這個模式底下使用者可以進行複製、刪除、貼上、移動游標、復原等任務。
  • 編輯模式 (edit mode):在上述模式底下輸入『 i 』這個按鈕,就可以進入編輯模式,終於可以開始打字編輯文件了。
  • 延伸指令列命令模式 (extended command mode):這個模式可以進行儲存、離開、強制離開、搜尋與取代等動作。
  • 選取模式 (vitual mode):這個模式可以進行類似滑鼠圈選的選取模式,主要分為三種圈選方式:
    • v :字元方式圈選;
    • [shift]+v :以整行方式圈選
    • [ctrl]+v :以區塊方式圈選
    圈選完畢後,可以按下 y 複製、可以按下 d 刪除,然後在其他地方可以按下 p 貼上喔!

簡單的說,讀者可以將數種模式使用底下的圖示來思考一下相關性:

圖 3.3.1-1、vim 數種模式的相互關係
圖 3.3.1-1、vim 數種模式的相互關係

假設讀者想要嘗試編輯 /etc/services 這個檔案,可以這樣嘗試處理看看:

  1. 使用『 cd /dev/shm 』將工作目錄移動到記憶體當中
  2. 使用『 cp /etc/services . 』將檔案複製一份到本目錄下
  3. 使用『 vim services 』開始查閱 services 的內容,並請回答:
    圖 3.3.1-2、vim 的編輯顯示畫面
    圖 3.3.1-2、vim 的編輯顯示畫面
    1. 最底下一行顯示的『 "services" 11473L, 692252B 』是什麼意思?
      (Ans: 代表檔名、行數、位元數)
    2. 為什麼在 # 之後的文字顏色與沒有 # 的那行不太一樣?
      (Ans: vim 會依據系統的設定,給予註解與否的顏色展示)
  4. 使用方向鍵,移動游標到第 100 行,並回答,你怎麼知道游標已經在第 100 行?
  5. 圖 3.3.1-3、vim 的編輯顯示畫面
    圖 3.3.1-3、vim 的編輯顯示畫面
  6. 回到第 5 行,按下『 i 』之後,你看到畫面中最底下一行的左邊出現什麼?
  7. 圖 3.3.1-4、vim 的編輯顯示畫面
    圖 3.3.1-4、vim 的編輯顯示畫面
  8. 按下 Enter 按鈕以新增一行,然後方向鍵重回第 5 行,之後隨便輸入一串文字。 輸入完畢後,直接按下 [esc] 按鈕,螢幕最下方左下角會有什麼變化?
  9. 圖 3.3.1-5、vim 的編輯顯示畫面
    圖 3.3.1-5、vim 的編輯顯示畫面
  10. 要離開時,記得關鍵字是 quit,此時請按下『 :q 』,看一下游標跑到什麼地方去了?
  11. 圖 3.3.1-6、vim 的編輯顯示畫面
    圖 3.3.1-6、vim 的編輯顯示畫面
  12. 在輸入『 :q 』並且按下 Enter 之後,螢幕最下方出現什麼資訊?怎麼會這樣?
  13. 圖 3.3.1-7、vim 的編輯顯示畫面
    圖 3.3.1-7、vim 的編輯顯示畫面
  14. 按下『 :w 』儲存,然後重新『 :q 』離開,這時可以離開了嘛?
例題 3.3.1-1:實習 vim 的練習
  1. 承上,繼續 vim services
  2. 請在第 1 行加上『 Welcome to my linux server 』的字樣,輸入完畢後請回到一般指令模式
  3. 在一般指令模式底下,跑到第 5 行,按下『 dd 』,看看發生什麼事情?
  4. 回到第 1 行,按下『 p 』又出現什麼資訊?
  5. 連續按下 5 次『 p 』,然後又按一次『 5p 』又出現什麼?
  6. 按下『 u 』會出現什麼狀況?
  7. 跑到第 1 行,按下『 yy 』然後跑到第 10 行,按下『 p 』,又出現什麼情況?
  8. 按下『 G 』(注意大小寫),游標跑到哪裡去?
  9. 按下『 gg 』(注意大小寫),游標跑到哪裡去?
  10. 現在不想要編輯這個檔案了 (因為亂搞一通),不儲存離開時,按下『 :q 』會一直出現僅告尚未存檔的訊息, 你輸入『 :q! 』之後,可以不儲存離開了嘛?

3.3.2:常用的 vim 一般指令模式與指令列模式列表

通過上述的練習,讀者應該會對 vim 有初步的認識。vim 的功能其實不只這些,不過管理員會經常用到的大概就是上述的這些資訊而已。 底下為常用的指令列表:

慣用的指令說明
i, [esc] i 為進入編輯模式, [esc] 為離開編輯模式
G 移動到這個檔案的最後一列
gg 移動到這個檔案的第一列
nG n 為數字,移動到這個檔案的第 n 列,例如 10G 為讓游標去到第 10 列
dd dd 為刪除游標所在行,5dd 為刪除 5 行,ndd 為刪除 n 行
yy yy 為複製游標所在行,5yy 為複製 5 行,nyy 為複製 n 行
p 在游標底下貼上剛剛刪除/複製的資料
u 復原前一個動作
:w 將目前的資料寫入硬碟中
:q 離開 vim
:q! 不儲存 (強制) 離開 vim

讀者大概之要知道這幾個按鈕即可,其他的更進階的功能有用到的時候再到基礎學習篇查閱即可。

例題 3.3.2-1:使用 history 記載下達過得指令,並使用 vim 的『選取模式』進行資料刪減
  1. 使用 student 的身份輸入 history ,查閱這次有效的歷史命令有幾個,假設有 50 筆新的指令好了。
  2. 使用『 history 50 >> ~/history.log 』將指令紀錄到 history.log 檔案中
  3. 使用『 vim ~/history.log 』編輯該檔案,將無效的指令移除,只剩下有需要的檔案,同時在指令後說明該指令的用途。

3.3.3:修改 vim 的環境設定 .vimrc

包括 RockyLinux 9 ,在 RHEL 8 以後的系統,vim 的版本自動化的太厲害了!加上許多縮排與前後數行提前顯示等等。RockyLinux 9 這一版的 vim 增加更多功能。包括在游標所在行之前、後的 5 行自動先行顯示等等。 不過,對某些人來說,增加這些自動判斷的功能,反而會影響到某些複製、貼上的工作!所以,你可能會想要取消這些特定的功能。 如何取消呢?可以透過 vim 的 :set 功能來處理!

實際練習:讓你的 vim 環境自動加上行號,同時取消/載入語法檢驗:
  1. 同樣的,再次編輯你的 service 檔案,進入編輯之後,在一般指令列模式下,輸入『:set nu』來設定行號, 一切順利的話,應該會出現類似底下的模樣:
    圖 3.3.3-1、vim 一些設定值處理
    圖 3.3.3-1、vim 一些設定值處理
  2. 那如果想要取消語法檢查,尤其在某些黑底白字的環境下,光是看藍色字體的環境,會崩潰!可以用『:syn off』取消!
    圖 3.3.3-2、vim 一些設定值處理
    圖 3.3.3-2、vim 一些設定值處理

不過,上述的功能設定,都會在下次重新開啟新的 vim 時被還原成預設值。如果你想要每次都生效的設定,那就得要修改家目錄下的 vim 設定檔, 檔名是 ~/.vimrc 喔!在設定檔內,雙引號是註解~如果你以前用過 vim, 而且覺得以前的環境比較適應的話,那可以將你的 ~/.vimrc 內容修訂成為底下的模樣即可:

[student@localhost ~]$ vim ~/.vimrc
" 設定搜尋到的關鍵字為高亮度反白
set hlsearch
" 設定語法檢驗功能
syntax on
" 取消自動搜尋機制
set noincsearch
" 搜尋時,忽略大小寫的差異
set ignorecase
" 設計自動縮排
set autoindent
" 設定自動產生行號
set nu
" 設定 tab 的寬度為 8 個字元
set tabstop=8
" 設定預先顯示的行數為 0,亦即不預先顯示
set scrolloff=0
" 設定不要折行
set nowrap
" 設定游標所在行顯示特殊字樣
set cursorline

儲存後離開,以後你使用 vim 編輯資料時,就會出現類似底下的圖示了!如果不喜歡,就自己修改掉相關的設定吧!

圖 3.3.3-3、vim 一些設定值處理
圖 3.3.3-3、vim 一些設定值處理

3.4:課後練習操作

  • 上課的課後練習,非作業:
  1. 關於 vim 建立檔案,以及資料的轉存情況:(使用 student 身份)
    1. 先用 vim 建立一個名為 /dev/shm/mycheck.txt 的檔案,裡面填寫你的姓名與學號,一行一個
    2. 使用 file 去檢查 /etc/group /bin/groups 的檔案類型,並將查詢的資料轉存並累加到 /dev/shm/mycheck.txt 當中
    3. 查詢出 /etc/ 底下,使用 s 開頭以及 s 結尾的檔名 (不含子目錄下的檔案),並將找到的檔名轉存並累加一份到 /dev/shm/mycheck.txt 當中
    4. 找出最近有使用過的 rm 的指令,並將該執行的指令轉存並累加到 /dev/shm/mycheck.txt 當中
    5. 將 /etc/passwd 前 5 行與最後 5 行抓出來,並且附上行號之後,轉存並累加到 /dev/shm/mycheck.txt 當中
  2. 關於檔案管理:(使用 student 身份)
    1. 嘗試在 /dev/shm/unit03/files/ 目錄下,新增 ksu001 ~ ksu100 這 100 個空檔案
    2. 嘗試在 /dev/shm/unit03/dirs/ 目錄下,新增 dir01 ~ dir10 這 10 個空目錄
    3. 嘗試在 /dev/shm/unit03/season/ 目錄下,新增 jan, feb, mar 這三個空目錄
    4. 嘗試在 /dev/shm/unit03/seaon/ 目錄下的 jan, feb, mar 子目錄內,建立 mylog_XX_YY_ZZ.txt 空檔案,其中:『XX 為 1~9』, 『YY 為 aa 與 bb』,『ZZ 為 start 與 end』。
    5. 嘗試在 /dev/shm/unit03/spc/ 目錄下,建立名為 -check.txt 的目錄
  • 作業 (不提供學生答案,僅提供教師參考答案)

作業硬碟一般操作說明:

  • 開啟雲端虛擬機器前,請務必確認你開啟的硬碟是『unit03』,否則就會做錯題目
  • 若要使用圖形界面,請務必使用 student 身份登入,若需要切換身份,再啟用終端機處理。
  • 若有簡答題需要使用中文,請自行以第一堂課的動作自行處理輸入法安裝。
  • 每部虛擬機器均有獨特的網卡位址,請勿使用他人硬碟上傳,否則計分為 0 分。
  • 每位同學均有自己的 IP 尾數,請先向老師詢問您的 IP 尾數,才可以進行作業上傳。
  • 最終上傳作業結果,請務必使用 root 身份上傳。
  • 進入作業硬碟後,先用 root 身份執行 vbird_book_setup_ip , 執行流程請參考:vbird_book_setup_ip

作業當中,某些部份可能為簡答題~若為簡答題時,請將答案寫入 /home/student/ans.txt 當中,並寫好正確題號,方便老師訂正答案。 請注意,檔名寫錯將無法上傳!

  1. (20%)使用 vim 建立一個名為 ~/ans.txt 的檔案,內容先填寫你的學號與姓名,並在找出底下的任務後,寫下正確答案 (使用 student 身份進行):
    1. 請先實際找出你系統中的 /etc/passwd, /etc/pam.d /etc/rc.local, /dev/vda 這 4 個檔案的『檔案類型 (如純文字檔案、執行檔等等等)』後, 將這 4 個的類型寫入 ~/ans.txt 檔案中。
    2. 找出 /usr/lib64 這個目錄內,有個檔名長度為 5 個字元的一般檔案,將該檔案檔名寫入 ~/ans.txt 中。
    3. 找出 /etc 底下(不含子目錄),檔名含有 4 個數字 (數字不一定連接在一起) 的資料,寫下 (1)該檔案的『絕對路徑』檔名,(2)該檔案的類型
  2. (30%)在 student 家目錄下,新增一個名為 class03 的目錄,並進入該目錄成為工作目錄,並且完成底下的工作 (底下所謂的『當前目錄』都在 class03 目錄下!):
    1. 在當前的目錄下,新建名為 mytest_XX_YY_ZZ.txt 的一堆空白檔案,其中 XX 為『 class1, class2, class3 』,而 YY 為『 week1, week2, week3 』,ZZ 則為『 one, two, three, four 』。
    2. 建立一個名為 class1/week2 的目錄,將當前目錄中,含有 class1_week2 的檔名通通『複製』到 class1/week2 目錄下
    3. 將檔名含有 class1 檔案,通通『移動』到 class1 目錄下
    4. 新建一個名為 one 的目錄,將當前目錄中,所有檔名含有 one 的檔案通通『移動』到 one 底下
    5. 建立一個名為 others 的目錄,將當前檔名開頭為 mytest 的檔案,通通『移動』到該目錄下 (原則上,做完這題後,在該目錄下只剩下子目錄,沒有一般檔案存在才對!)
  3. (30%)回到 student 家目錄,並且完成底下的任務:
    1. 在 student 家目錄底下,建立一個名為 -myhome 的目錄,並將 student 家目錄中,以 b 為開頭的『隱藏檔』複製到 -myhome 目錄內
    2. 切換工作目錄到 -myhome 目錄內,並將 /etc/sysconfig 目錄複製到當前目錄下 (過程中產生一些錯誤訊息是正常的!)
    3. 將當前目錄下的 sysconfig/cbq 目錄刪除
    4. 列出 /etc/profile 與 /etc/services 的最後 5 行,並將這 10 行轉存到當前目錄下的 myetc.txt 檔案中 (myetc.txt 預設不存在)
    5. 將 myetc.txt 複製成為 myetc2.txt,並使用 vim 編輯 myetc2.txt ,第一行加入『 I can use vim 』的字樣即可。
  4. (20%)其他檔案管理:
    1. 在 student 家目錄下,建立一個 userid 的子目錄,並將工作目錄移動到 userid 內,在 userid 這個目錄內,嘗試以一個指令建立 ksuid001 ksuid002 ... 到 ksuid020 等 20 個『空白目錄』
    2. 在 student 家目錄下,有個名為 mytext.txt 的檔案,請使用 vim 開啟該檔案,並將第一行複製後,貼上 100 次,之後『強制儲存』即可離開 vim 。
    3. 在 /opt 底下,有個以減號 (-) 為開頭的檔名,該檔案做錯了,因此,請將他刪除 (可能需要 root 的權限)

作業結果傳輸:請以 root 的身分執行 vbird_book_check_unit 指令上傳作業結果。 正常執行完畢的結果應會出現【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字樣。若需要查閱自己上傳資料的時間, 請在作業系統上面使用瀏覽器查詢: http://192.168.251.254 檢查相對應的課程檔案。 相關流程請參考: vbird_book_check_unit

修改歷史:
  • 2023/02/20:從 CentOS 8.x 改版而來,不過,由於 vim 預設的設定較多,為了取消預設值,增加修改 .vimrc 的內容!不過,作業尚未整理
  • 2023/02/21:作業硬碟處理完畢,而且加入了實作檢查回應結果的小環節~同學可以查看自己的答案了!可以一直作到對為止!
2023/02/20 以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計