跳至主要内容

目錄與檔案操作

雖然 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 中,我們經常需要在不同的資料夾(目錄)之間穿梭。以下是管理目錄最常用的指令:

【目錄切換與檢視】

  1. pwd:顯示目前所在目錄 (Print Working Directory) 會印出你現在所處的絕對路徑,這是在終端機迷路時最重要的指令!

    輸入指令

    pwd

    輸出結果

    /root
  2. cd:切換目錄 (Change Directory) 用來進入其他的資料夾。

    常用參數與縮寫

    • cd /:前往系統最頂層的根目錄。
    • cd ~:前往當前使用者的家目錄 (Home)。
    • cd ..:回到上一層目錄。

    輸入指令(切換到 /etc 目錄):

    cd /etc
  3. ls:列出目錄內容清單 這是系統中最基礎的指令,用來查看目前路徑底下有哪些檔案與資料夾。

    常用參數

    • -l:(long) 列出詳細資訊(包含權限、擁有者、檔案大小、修改時間等)。
    • -a:(all) 列出所有檔案,包含以 . 開頭的隱藏檔。
    • -h:(human-readable) 將檔案大小轉換為人類易讀的單位(如 K, M, G,通常會搭配 -l 使用)。

    輸入指令(組合多個參數):

    ls -lah

    輸出結果

    total 12K
    drwxr-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
  4. mkdir:建立新目錄 (Make Directory) 用來建立新的資料夾。

    常用參數

    • -p:(parents) 若父目錄不存在則一併建立,不會報錯。例如 mkdir -p a/b/c

    輸入指令

    mkdir -p my_folder/sub_folder
  5. rmdir:刪除空目錄 (Remove Directory) 用來刪除「空」的資料夾。注意:如果資料夾裡面有任何檔案或子目錄,rmdir 會報錯並拒絕刪除。

    實務小提醒:正因為它只能刪除空目錄,顯得有些雞肋,所以在實務上維運工程師通常會直接使用下一節會教到的 rm -rrm -rf 來刪除整個資料夾(不管裡面有沒有東西),rmdir 反而比較少用到。

    輸入指令

    rmdir my_folder

檔案操作指令

💡 核心觀念:在 Linux 的世界裡,一切皆檔案 (Everything is a file)

雖然我們為了方便新手學習,將「目錄」與「檔案」拆分成兩個章節,但在 Linux 的底層設計中,「目錄 (Directory)」本身也只是一種特殊格式的「檔案」而已。 這就是為什麼接下來介紹的 cpmvrm,它們既能用來操作一般檔案,也能透過加上 -r (遞迴) 參數,直接對「目錄」進行複製、移動或刪除喔!

【檔案建立與管理】

  1. touch:建立空檔案(或更新檔案時間) 如果檔案不存在,會建立一個內容為空的檔案;如果檔案已存在,則會更新檔案的修改時間。

    常用參數:無特別常用,通常直接接檔名。

    輸入指令

    touch newfile.txt

    輸出結果

    # (沒有特別輸出,若成功執行則直接返回提示字元)
  2. cp:複製檔案或目錄 用來複製 (Copy) 檔案,若是複製目錄則必須加上遞迴參數。

    常用參數

    • -r-R:(recursive) 遞迴複製,用來複製「整個目錄」及其內容。
    • -p:(preserve) 連同檔案的屬性(權限、擁有者、時間)一起複製。

    輸入指令(複製檔案並改名):

    cp file.txt file_backup.txt

    輸出結果

    # (成功複製則無特別輸出)
  3. mv:移動檔案(或重新命名) 用來移動 (Move) 檔案到另一個路徑。在 Linux 中,如果在「同一個路徑」下移動檔案,就等同於「重新命名」。

    常用參數

    • -f:(force) 強制覆蓋,若目的地已有同名檔案,不會詢問直接覆蓋。
    • -i:(interactive) 互動模式,若目的地已有同名檔案,會詢問是否覆蓋。

    輸入指令(將檔案重新命名):

    mv file_backup.txt file_old.txt

    輸出結果

    # (成功移動或重新命名則無特別輸出)
  4. rm:刪除檔案或目錄 用來刪除 (Remove) 檔案,極度危險的指令,執行前務必再三確認!

    常用參數

    • -r:(recursive) 遞迴刪除,用來刪除「整個目錄」。
    • -f:(force) 強制刪除,忽略不存在的檔案,且不提示確認(警告:慎用!)。

    輸入指令(強制刪除目錄):

    rm -rf my_folder

    輸出結果

    # (成功刪除則無特別輸出,但在實務上沒有消息就是好消息)

【檔案內容查看】 5. cat:正序一次性顯示所有內容 (Concatenate) 會將檔案內容從第一行到最後一行,一次性全部印在終端機畫面上。適合用來查看行數較少的設定檔。

常用參數

  • -n:(number) 顯示行號。

輸入指令

cat -n /etc/hostname

輸出結果

1 my-rocky-server
  1. tac:倒序一次性顯示所有內容 其實就是 cat 的反寫!它會從檔案的「最後一行」開始往前印到第一行。常運用在看 Log 時,想先看到最新的紀錄。

    常用參數:同 cat,但實務上較少加參數。

    輸入指令

    tac /etc/hostname

    輸出結果

    my-rocky-server
  2. less:分頁模式查看 當檔案太大(例如幾千行的日誌檔),用 cat 會瞬間洗版。less 允許你用鍵盤的上下鍵或 PageUp/PageDown 捲動查看,且支援搜尋。看完後按 q 離開。

    常用操作

    • Space:往下翻一頁。
    • /字串:往下搜尋該字串。

    輸入指令

    less /var/log/messages

    輸出結果

    # (畫面會切換至獨立的閱讀模式,顯示日誌前幾行,按 q 退出)
  3. head:顯示檔案的前幾行 只擷取檔案開頭的部分,預設顯示前 10 行。

    常用參數

    • -n:指定要顯示幾行。

    輸入指令(只看前 3 行):

    head -n 3 /etc/passwd

    輸出結果

    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
  4. 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 root
    Jul 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
  1. 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
# 任務圓滿完成!
進階延伸閱讀:生產環境 Log 探勘與正規過濾

當你熟悉了日常的 catless 與基礎 grep 後,在伺服器面臨 DDoS 攻擊或千萬筆 Log 異常時,請參閱進階排錯篇章: 👉 15-file-search-regex.md (🔍 尋找檔案與字串過濾:Log 探勘神技)