目錄與檔案操作
雖然 Linux 有提供圖形化介面 (GUI),但系統管理員通常更習慣在終端機 (Terminal) 中透過指令來操作,不僅執行效率更高,看起來也比較高級(誤)。本章節將帶你認識 Linux 最核心的指令操作基礎。
指令輸入結構
一個標準的 Linux 指令,通常由三個部分組成:
指令名稱 (Command) [選項/參數 (Options)] [操作目標 (Arguments)]
我們繼續用前面的 ls 指令來當作範例:
1. 單純輸入指令 只輸入指令名稱,會以預設的行為執行(例如單純列出檔案名稱)。
輸入指令:
ls
輸出結果:
afs dev home lib64 media opt root sbin sys usr
bin etc lib lost+found mnt proc run srv tmp var
2. 加上參數 (Options)
參數通常以 - (短參數) 或 -- (長參數) 開頭,用來改變指令的預設行為。例如加上 -l 可以列出檔案的「詳細資料」。
輸入指令:
ls -l
輸出結果:
total 52
dr-xr-xr-x 2 root root 4096 May 14 2022 afs
lrwxrwxrwx 1 root root 7 May 14 2022 bin -> usr/bin
drwxr-xr-x 5 root root 360 Jul 23 06:16 dev
...以下略
3. 組合多個參數
當我們有多個短參數時,可以將它們合併在一起寫。例如 -l (詳細資料) 加上 -a (顯示包含 . 開頭的隱藏檔),就可以合併寫成 -la。
輸入指令:
ls -la
輸出結果:
total 60
drwxr-xr-x 1 root root 4096 Jul 23 06:16 .
drwxr-xr-x 1 root root 4096 Jul 23 06:16 ..
-rwxr-xr-x 1 root root 0 Jul 23 06:16 .dockerenv
...以下略
這源自於參數的兩種命名風格:
1. 短參數 (Short Options,單減號 -)
- 特點:通常後面只接一個英文字母(例如
-l、-a、-h),源自最早期的 Unix 系統設計。 - 優點:輸入速度快,而且多個短參數可以合併在一起寫(例如
ls -l -a -h可以簡寫成ls -lah)。
2. 長參數 (Long Options,雙減號 --)
- 特點:後面接完整的單字或多個用連字號隔開的單字(例如
--version、--help、--all),這是隨著 GNU 專案發展而普及的風格。 - 優點:語意清晰直覺,看名字就知道是什麼意思,不需要死背單字母縮寫。
那有三個減號 --- 嗎?
標準的 Linux 指令列解析中,並沒有「三個減號」的設計。
- 單減號
-:短參數群組。 - 雙減號
--:長參數。 - 獨立的雙減號
--(後面沒字):代表「參數結束」。這非常實用!如果你有一個檔案名稱剛好叫做-foo,你可以用rm -- -foo來刪除它,這樣--後面的所有字串都會被強制視為「普通目標物件」,避免系統把-foo誤認為是指令的參數。
目錄操作指令
在 Linux 中,我們經常需要在不同的資料夾(目錄)之間穿梭。以下是管理目錄最常用的指令:
【目錄切換與檢視】
-
pwd:顯示目前所在目錄 (Print Working Directory) 會印出你現在所處的絕對路徑,這是在終端機迷路時最重要的指令!輸入指令:
pwd輸出結果:
/root -
cd:切換目錄 (Change Directory) 用來進入其他的資料夾。常用參數與縮寫:
cd /:前往系統最頂層的根目錄。cd ~:前往當前使用者的家目錄 (Home)。cd ..:回到上一層目錄。
輸入指令(切換到 /etc 目錄):
cd /etc -
ls:列出目錄內容清單 這是系統中最基礎的指令,用來查看目前路徑底下有哪些檔案與資料夾。常用參數:
-l:(long) 列出詳細資訊(包含權限、擁有者、檔案大小、修改時間等)。-a:(all) 列出所有檔案,包含以.開頭的隱藏檔。-h:(human-readable) 將檔案大小轉換為人類易讀的單位(如 K, M, G,通常會搭配-l使用)。
輸入指令(組合多個參數):
ls -lah輸出結果:
total 12Kdrwxr-xr-x 2 root root 4.0K Jul 23 14:00 .drwxr-xr-x 5 root root 4.0K Jul 23 13:50 ..-rw-r--r-- 1 root root 12 Jul 23 14:00 .dockerenv-rw-r--r-- 1 root root 1.5M Jul 23 14:00 file.txt -
mkdir:建立新目錄 (Make Directory) 用來建立新的資料夾。常用參數:
-p:(parents) 若父目錄不存在則一併建立,不會報錯。例如mkdir -p a/b/c。
輸入指令:
mkdir -p my_folder/sub_folder -
rmdir:刪除空目錄 (Remove Directory) 用來刪除「空」的資料夾。注意:如果資料夾裡面有任何檔案或子目錄,rmdir會報錯並拒絕刪除。實務小提醒:正因為它只能刪除空目錄,顯得有些雞肋,所以在實務上維運工程師通常會直接使用下一節會教到的
rm -r或rm -rf來刪除整個資料夾(不管裡面有沒有東西),rmdir反而比較少用到。輸入指令:
rmdir my_folder
檔案操作指令
雖然我們為了方便新手學習,將「目錄」與「檔案」拆分成兩個章節,但在 Linux 的底層設計中,「目錄 (Directory)」本身也只是一種特殊格式的「檔案」而已。
這就是為什麼接下來介紹的 cp、mv、rm,它們既能用來操作一般檔案,也能透過加上 -r (遞迴) 參數,直接對「目錄」進行複製、移動或刪除喔!
【檔案建立與管理】
-
touch:建立空檔案(或更新檔案時間) 如果檔案不存在,會建立一個內容為空的檔案;如果檔案已存在,則會更新檔案的修改時間。常用參數:無特別常用,通常直接接檔名。
輸入指令:
touch newfile.txt輸出結果:
# (沒有特別輸出,若成功執行則直接返回提示字元) -
cp:複製檔案或目錄 用來複製 (Copy) 檔案,若是複製目錄則必須加上遞迴參數。常用參數:
-r或-R:(recursive) 遞迴複製,用來複製「整個目錄」及其內容。-p:(preserve) 連同檔案的屬性(權限、擁有者、時間)一起複製。
輸入指令(複製檔案並改名):
cp file.txt file_backup.txt輸出結果:
# (成功複製則無特別輸出) -
mv:移動檔案(或重新命名) 用來移動 (Move) 檔案到另一個路徑。在 Linux 中,如果在「同一個路徑」下移動檔案,就等同於「重新命名」。常用參數:
-f:(force) 強制覆蓋,若目的地已有同名檔案,不會詢問直接覆蓋。-i:(interactive) 互動模式,若目的地已有同名檔案,會詢問是否覆蓋。
輸入指令(將檔案重新命名):
mv file_backup.txt file_old.txt輸出結果:
# (成功移動或重新命名則無特別輸出) -
rm:刪除檔案或目錄 用來刪除 (Remove) 檔案,極度危險的指令,執行前務必再三確認!常用參數:
-r:(recursive) 遞迴刪除,用來刪除「整個目錄」。-f:(force) 強制刪除,忽略不存在的檔案,且不提示確認(警告:慎用!)。
輸入指令(強制刪除目錄):
rm -rf my_folder輸出結果:
# (成功刪除則無特別輸出,但在實務上沒有消息就是好消息)
【檔案內容查看】
5. cat:正序一次性顯示所有內容
(Concatenate) 會將檔案內容從第一行到最後一行,一次性全部印在終端機畫面上。適合用來查看行數較少的設定檔。
常用參數:
-n:(number) 顯示行號。
輸入指令:
cat -n /etc/hostname
輸出結果:
1 my-rocky-server
-
tac:倒序一次性顯示所有內容 其實就是cat的反寫!它會從檔案的「最後一行」開始往前印到第一行。常運用在看 Log 時,想先看到最新的紀錄。常用參數:同
cat,但實務上較少加參數。輸入指令:
tac /etc/hostname輸出結果:
my-rocky-server -
less:分頁模式查看 當檔案太大(例如幾千行的日誌檔),用cat會瞬間洗版。less允許你用鍵盤的上下鍵或PageUp/PageDown捲動查看,且支援搜尋。看完後按q離開。常用操作:
Space:往下翻一頁。/字串:往下搜尋該字串。
輸入指令:
less /var/log/messages輸出結果:
# (畫面會切換至獨立的閱讀模式,顯示日誌前幾行,按 q 退出) -
head:顯示檔案的前幾行 只擷取檔案開頭的部分,預設顯示前 10 行。常用參數:
-n:指定要顯示幾行。
輸入指令(只看前 3 行):
head -n 3 /etc/passwd輸出結果:
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin -
tail:顯示檔案的最後幾行 只擷取檔案結尾的部分,預設顯示後 10 行。這在系統維運中極度重要,因為最新的錯誤訊息通常寫在最後面。常用參數:
-n:指定要顯示幾行。-f:(follow) 持續追蹤檔案的增長,不會結束程式。當有新的 Log 寫入時會即時印在畫面上,按Ctrl + C結束。
輸入指令(即時查看最後 5 行日誌):
tail -n 5 -f /var/log/secure輸出結果:
Jul 23 14:10:01 my-rocky sshd[1234]: Accepted publickey for rootJul 23 14:15:22 my-rocky sshd[1250]: Disconnected from user root# (游標會停留在這裡,等待新的內容出現...)
【進階搜尋與過濾】
10. grep:在檔案中搜尋字串
(Global Regular Expression Print) 是 Linux 最強大的文字搜尋工具。它會一行一行找,只要該行包含你指定的字串,就會把那「整行」印出來。
常用參數:
-i:(ignore case) 忽略大小寫。-v:(invert match) 反向選擇,印出「不包含」該字串的行。-n:顯示匹配的行號。
輸入指令(在密碼檔中搜尋 root,忽略大小寫):
grep -i "root" /etc/passwd
輸出結果:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
-
find:在系統中搜尋檔案或目錄 如果說grep是用來找檔案「裡面」的內容,那find就是用來找檔案「本身」在哪裡。它是 Linux 中最強大(但也稍微複雜)的檔案搜尋工具。常用參數:
-name:依照檔案名稱搜尋(支援*萬用字元,建議用引號包起來避免被 Bash 提早解析)。-type:依照檔案類型搜尋(f代表檔案 file,d代表目錄 directory)。-size:依照檔案大小搜尋(例如+100M代表找大於 100MB 的檔案)。
輸入指令(在
/var/log目錄底下,尋找副檔名為.log的所有檔案):find /var/log -type f -name "*.log"輸出結果:
/var/log/boot.log/var/log/messages.log/var/log/secure.log# ...列出所有符合條件的檔案絕對路徑
🏢 實境演練:日誌檔的過濾與備份
情境背景:
老闆緊急要求你:「去 /var/log 裡面把主要的系統日誌 (messages) 找出來,複製到你家目錄下的 backup 資料夾。但我只要看裡面發生過 Error 的行數就好,最後把沒過濾過的原始檔案刪掉清出空間。」
你的操作 SOP (Standard Operating Procedure):
# 1. 先回到安全的家目錄 (~) 並建立 backup 資料夾
$ cd ~
$ mkdir backup
# 2. 為了保險,切換到日誌所在目錄再開始操作
$ cd /var/log
# 3. 複製檔案:把 messages 這個日誌檔複製到家目錄下的 backup 中
$ cp messages ~/backup/
# 4. 進行字串過濾:我們只要裡面包含 "error" 的記錄 (忽略大小寫)
# (💡 註:這裡用到了未來會詳細教的「重導向 >」把過濾結果存成新檔案)
$ grep -i "error" ~/backup/messages > ~/backup/messages_error_only.txt
# 5. 確認過濾成功後,把剛剛複製過去的巨大原始日誌檔刪除,只留下精華版
$ rm -f ~/backup/messages
# 6. 最後,我們進去檢查一下戰果!
$ cd ~/backup
$ ls -lah
# 輸出結果:
# -rw-r--r-- 1 root root 12K Jul 23 15:00 messages_error_only.txt
# 任務圓滿完成!
當你熟悉了日常的 cat、less 與基礎 grep 後,在伺服器面臨 DDoS 攻擊或千萬筆 Log 異常時,請參閱進階排錯篇章:
👉 15-file-search-regex.md (🔍 尋找檔案與字串過濾:Log 探勘神技)