緯育 2026-0320
出自頂極製作所
Linux 基礎指令
本次講座主要介紹 Linux/Unix 系統中的核心概念與基礎指令。講師首先詳細解釋了控制檯 (Console) 和終端機 (Terminal) 的定義、差異及實際應用。控制檯是本地端直接操作的設備,而終端機則用於遠端連線。講座中也介紹了 Linux 的共通目錄架構,特別是 /dev 目錄,並強調「在 Unix/Linux 中,萬物皆為檔案」(Everything is a file) 的重要哲學。
接著,講師透過實際操作示範了多項基礎指令,包括虛擬控制檯 (TTY) 的切換、使用者登入登出、系統關機與重啟。並詳細解說了 Linux 指令的基本架構,包含指令本身、選項(長短選項的區別與用法)和參數。此外,也示範了 echo、date、cal 等常用指令,並說明如何自訂格式化輸出。
講座的另一大重點是查詢指令用法的三種主要方式:使用 --help 參數(可結合 | less 分頁檢視)、查閱 man 手冊(並介紹其章節編號的重要性,如 man 1 passwd 與 man 5 passwd 的區別),以及使用 info 指令。
Linux 基礎概念與課程介紹
- 課程內容概述
- 介紹 Linux 系統的基本操作,包括開關機與重啟。
- 講解 Linux 的目錄架構,說明各個通用目錄的用途。
- 大量介紹指令的架構、用法以及如何在本機查詢指令說明。
- 介紹檔案與目錄的操作指令。
- Linux 目錄架構共通性
- 不同的 Linux 發行版(如 Ubuntu, CentOS)或類 Unix 系統(如 macOS)都擁有共通的核心目錄結構。基礎架構大致一致,各發行版可能會有其特有的額外目錄。
控制檯 (Console)、終端機 (Terminal) 與 TTY/PTS
- 控制檯 (Console) vs. 終端機 (Terminal)
- 共通點: 兩者都是使用者與系統溝通的介面,用於執行指令、變更設定或顯示資訊。
- 控制檯 (Console): 指使用者直接在電腦主機的螢幕前進行的「本地端」操作。Linux 系統只有一個真實 Console,其餘為軟體模擬的虛擬控制檯 (Virtual Console, TTY)。
- 終端機 (Terminal): 指透過網路或纜線進行的「遠端連線」。在 Unix/Linux 中,也稱為偽終端機 (Pseudo Terminal, PTY 或 PTS)。
- Linux 虛擬控制檯 (TTY)
- 概念: Linux 透過軟體模擬出多個虛擬控制檯 (TTY),預設啟用 6 到 7 個。每個 TTY 都是獨立的登入介面,可在單一螢幕上實現多工操作。
- 切換方式:
- 使用快速鍵 Alt + F1 ~ F6 在不同 TTY 間切換。在圖形介面 (GUI) 下則需使用 Ctrl + Alt + F1 ~ F6。
- 使用指令 chvt [編號] 切換,例如 chvt 4 切換至 TTY4。
- 設備檔案: 虛擬控制檯對應的設備檔案位於 /dev 目錄下,如 /dev/tty1, /dev/tty2 等。可以使用 tty 指令查看當前所在的終端機。
- 遠端連線與偽終端機 (PTS)
- 連線原理: 透過 SSH 等方式遠端連線時,系統會建立一個偽終端機,並在 /dev/pts/ 目錄下生成一個對應的設備檔案,如 /dev/pts/0。
- 生命週期: PTS 檔案在使用者成功登入後建立,登出後即被移除。
- 桌面環境的終端機: 在圖形介面中開啟的「終端機」應用程式,本質上也是一個偽終端機 (PTS)。
- Everything is a file 哲學
- Unix/Linux 的核心哲學是「萬物皆為檔案」。硬體設備、控制檯、終端機都以檔案形式存在於 /dev 目錄。
- 使用者在 TTY 或 PTS 輸入的文字,實際上是與對應的設備檔案進行 I/O 溝通。可利用此特性進行跨終端機訊息傳遞,例如 echo "hello" > /dev/tty4。
使用者登入、登出與系統開關機
- 使用者登入與登出
- 登入 (Login): 輸入帳號密碼登入。系統會記錄所有登入嘗試,包括失敗記錄。
- 登出 (Logout): 可使用 exit、logout 指令或 Ctrl + D 快捷鍵。
- 系統關機與重開機
- 關機 (Shutdown):
- 常用指令:poweroff, halt, shutdown -h now。
- 定時關機:shutdown -h 10 (10分鐘後關機)。
- 重開機 (Reboot):
- 常用指令:reboot, shutdown -r now。
- 定時重開機:shutdown -r 10 (10分鐘後重開機)。
- 取消排程: 使用 shutdown -c 可以取消已預約的關機或重開機任務。
Linux 指令結構與查詢方法
- 指令基本結構
- 組成:指令 [選項] [參數],各部分以空白隔開。
- 選項 (Option):
- 長選項 (Long Option): 格式為 --單字 (如 --help),語意清晰但無法合併。
- 短選項 (Short Option): 格式為 -字母 (如 -h),輸入快且可合併 (如 -al),但較不直觀。
- 參數 (Argument): 指令操作的對象,其意義由指令和選項決定。
- 指令用法查詢方法
- 方法一:--help 參數:
- 用法:[指令名稱] --help,提供快速簡潔的說明。
- 搭配 | less: 當說明過長時,可使用 [指令] --help | less 進行分頁瀏覽。
- 方法二:man 手冊 (manual pages):
- 用法:man [指令名稱],提供最詳細、結構化的官方文件。
- 操作:可用 g/G 跳至頭尾,/ 進行搜尋,n/N 跳至下/上一個結果,q 退出。
- 章節編號: man 手冊分為 8 個主要章節,用以區分不同類型的主題。例如 passwd 指令(章節1)和 /etc/passwd 檔案格式(章節5)。可使用 man [章節] [名稱] 查詢特定章節,如 man 5 passwd。
- 方法三:info 指令:
- 用法:info [指令名稱],提供超連結式的節點文件,類似線上書籍。此為獨立套件,部分精簡系統可能需另外安裝。
基礎指令範例
- echo 指令: 將後方字串印出到標準輸出(螢幕),可透過重導向輸出至檔案或設備。
- date 指令: 顯示或設定系統時間日期。可使用 + 搭配格式化字元自訂輸出,例如 date +"%A, %B %d, %Y"。
- cal 指令: 顯示月曆。可接受年份、月份作為參數,如 cal 1 2020。在某些新版系統(如 Ubuntu 22.04)中可能需透過 apt install ncal 安裝。
- /etc/passwd 檔案: Linux 系統中儲存使用者帳號資訊的純文字檔案,可使用 less /etc/passwd 查看其內容。
指令與Shell基礎
- Linux/Unix與微軟指令的差異
- 命名風格:微軟指令多為完整單字(COPY, MOVE, CLS),而Linux/Unix指令偏向縮寫(cp, mv, clear)。
- clear指令可用快捷鍵Ctrl+L,但支援性取決於Shell。
- Shell(命令列介面)的概念
- Shell是使用者與核心溝通的程式,常見的有Bash(Linux預設)、SH(舊版UNIX)、CSH(BSD)、Zsh(macOS新預設)。
- 重設螢幕指令 (reset)
- 當終端機畫面顯示異常或亂碼時,使用reset或tset指令可重新初始化,避免因登出中斷背景任務。
目錄與路徑操作
- 查詢目前所在目錄 (pwd)
- pwd(Print Working Directory)用於顯示當前的絕對路徑,在提示符未顯示完整路徑時特別有用。
- 列出目錄內容 (ls)
- 相當於微軟的dir,用於列出檔案與目錄。
- 常用參數:
- -a: 顯示所有檔案,包括以 . 開頭的隱藏檔。
- -l: 以長格式顯示詳細資訊(權限、擁有者、大小、時間等)。
- -F: 顯示檔案類型(如目錄加/,執行檔加*)。
- -s, -t, -r: 分別依大小、時間、反向排序。
- 切換目錄 (cd)
- 此指令在Linux與微軟系統中通用。
- 路徑概念:
- 絕對路徑:從根目錄/開始的完整路徑(如cd /etc)。
- 相對路徑:相對於目前目錄的路徑,不以/開頭(如cd .cache)。
- 特殊符號:
- .: 代表目前目錄。
- ..: 代表上一層目錄。
- ~: 代表目前使用者的家目錄(cd ~或單獨cd可快速返回家目錄)。
- -: 代表上一個工作目錄,可在最近兩個目錄間快速切換(微軟無此功能)。
Linux 檔案系統層次結構標準 (FHS)
- FHS(Filesystem Hierarchy Standard)定義了Linux根目錄下各目錄的標準用途,確保軟體相容性。
- 根目錄 (/)
- Linux檔案系統的頂層,相當於Windows的磁碟機代號。
- 重要子目錄詳解:
- /bin (Binary):存放所有使用者皆可執行的基本指令。
- /boot:存放開機相關檔案,如開機選單設定(grub)和Linux核心(vmlinuz)。
- /dev (Device):存放設備檔案。硬體(如硬碟sda、隨身碟sdb)插入時,系統會在此生成對應檔案。
- /etc (Et cetera):存放所有系統和服務的設定檔,管理相對集中。
- /home:存放一般使用者的家目錄,每個帳號對應一個子目錄。
- /lib (Library):存放系統運作所需的函式庫及核心模組(驅動程式)。
- /lost+found:ext系列檔案系統特有,用於存放因意外斷電等原因遺失的檔案片段。
- /media & /mnt (Mount):用於掛載外部儲存設備(如隨身碟、光碟)的掛載點。/media常用於經常性掛載,/mnt常用於臨時性掛載。
- /opt (Option):用於存放非作業系統官方提供的第三方軟體。
- /proc (Process):一個虛擬檔案系統,存在於記憶體中,反映系統當前所有程序的即時資訊。以程序ID(PID)命名的數字目錄包含該程序的詳細資訊。PID為1的程序是系統啟動的第一個程序,管理所有使用者程序。
- /root:超級使用者root的家目錄,與一般使用者分開存放以策安全。
- /run:存放執行中服務的暫存檔,如.pid檔,記錄服務的程序ID。
- /sbin (System Binary):存放系統管理員使用的系統級指令,如格式化磁碟等。
- /snap:Ubuntu特有的目錄,用於存放Snap套件,提供沙盒化的安全執行環境。
- /srv (Service):存放服務提供的資料,如網頁伺服器的網站檔案。
- /sys:與/proc類似的虛擬檔案系統,反映核心偵測到的硬體設備資訊。udev服務會監控此目錄變化,並在/dev下自動建立設備檔案。
- /tmp (Temporary):系統的通用臨時資料夾。
- /usr (User):存放使用者安裝的非系統基本軟體及其相關檔案(指令、函式庫等)。現代Linux系統常將根目錄下的bin, sbin, lib等透過符號連結指向/usr內的對應目錄,以統一管理。
- /var (Variable):專門存放經常變動的檔案,如快取、資料庫、遊戲存檔等。
- /var/log:存放所有系統和服務的日誌檔案(Log),是問題排查時最重要的目錄。
使用者與家目錄
- 家目錄(Home Directory)結構
- Linux/Unix:root使用者的家目錄在/root;一般使用者在/home/<username>。
- Windows:所有使用者(包括管理員)的設定檔都存放在C:\Users底下。
- 安全性考量:CentOS和Ubuntu預設不讓root直接登入,旨在提升系統安全性,與微軟作法相似。
檔案與目錄的建立
- 建立檔案 (touch)
- 建立檔案指令為 touch,後接檔名,如 touch test1.file。
- touch 的原始功能是更新既有檔案的時間戳(modification time)至目前時間。
- 若指定檔名不存在,系統會自動建立空檔案,故常用於快速建檔。
- 除了 touch 外尚有其他建檔方式,但本課程以 touch 為主。
- 建立目錄 (mkdir)
- 建立目錄指令為 mkdir,後接目錄名稱,如 mkdir test1.dir。
- 建立多層目錄:要一次建立巢狀目錄(如 test2.dir/test2-1.dir)需使用 -p 選項。
- 若未加 -p 嘗試建立多層目錄,會因上層不存在而報錯。
- 使用 mkdir -p test2.dir/test2-1.dir/test2-2.dir 可一次建立所有不存在的父目錄與子目錄。微軟系統似乎沒有此功能。
檔案與目錄的複製
- 複製檔案 (cp)
- 指令語法:cp [來源檔案] [目標檔案或目錄]。
- 範例:cp test1.file test1.file.copy 會將 test1.file 複製為 test1.file.copy。
- 也可複製到指定目錄,如 cp test1.file ./some_dir/。
- 複製目錄 (cp -r)
- 複製目錄需加 -r(或 -R)選項,代表遞迴(recursive)複製。
- -r 會將目錄本身及其所有檔案與子目錄一併複製。
- 忘記加 -r 複製目錄會導致指令失敗。
- 範例:cp -r test1.dir test1.dir.copy 會將 test1.dir 與其內容複製為新目錄 test1.dir.copy。
檔案與目錄的移動與重新命名
- 移動與重新命名 (mv)
- mv 可用於移動檔案/目錄,也可用於重新命名。
- 移動:mv [來源] [目標目錄]。例:mv test1.file.copy test1.dir/ 將檔案移至 test1.dir。
- 重新命名:mv [舊名稱] [新名稱]。例:mv test1.file test1.file.mv 將其更名為 test1.file.mv。
- 在 Linux 中,重新命名的本質是將目標「移動」至同一路徑下的新名稱;微軟系統另有 rename 指令。
- 課程示範在不同工作目錄(如 /etc, /var)下,透過完整路徑操作家目錄檔案。
檔案與目錄的刪除
- 刪除檔案 (rm)
- 刪除檔案的指令為 rm(remove)。
- 範例:rm test1.file.mv。
- 刪除前詢問:-i 會在刪除每個檔案前提示確認。
- 預設行為可能因作業系統或身分(User vs. Root)不同而異:如在 CentOS,Root 執行 rm 時可能預設啟用 -i;一般使用者則不會。Ubuntu 通常預設不詢問。
- 刪除目錄
- rmdir 專門刪除「空目錄」。若目錄內仍有內容,rmdir 會失敗。
- rm -d 也可刪除空目錄。
- 刪除非空目錄:使用 rm -r 遞迴刪除目錄內所有內容後再刪除目錄本身。
- 強制刪除:-f(force)會略過任何提示,強制執行(在權限允許下),即使檔案使用中。
- rm -rf 是非常強大且危險的組合,會強制遞迴刪除指定路徑下的所有內容。
- 使用 -rf 的風險補充
- 講師強調使用 rm -rf 必須極度小心路徑書寫。
- 例:欲刪除 /tmp 內容卻誤打成 rm -rf / tmp,會從根目錄 / 開始刪除所有檔案,導致系統崩潰。
- 即便現代系統對 rm -rf / 設有防堵機制,仍須保持高度謹慎。
搜尋工具全貌與速度/準確度取捨
- 僅以系統預設的四類方式為主:PATH 解析、which、whereis、locate;另補充 find 作為精準檔案搜尋的核心工具。
- 速度對比:locate 依資料庫搜尋,速度最快但可能不即時、不精準;find 現掃檔案系統,最準確最細緻但相對較慢。
- 精準度對比:find 可組合多條件(時間、大小、型態、深度、是否為空等)達到最高精準度;which/whereis 聚焦可執行檔與相關文件;PATH 反映實際執行版本。
PATH 與 which 指令
- PATH 概念:echo $PATH 檢視路徑;系統依 PATH 順序找指令,命中第一個即執行,影響使用到的指令版本。
- which:顯示指令所在路徑;可搭配 ls -l 驗證檔案屬性與大小。切勿刪除系統指令(如 rm,示例約 59K),若需限制行為以權限控制取代刪除。
- which -a:列出 PATH 中所有相符項,常見多個符號連結指向同一實體檔,有助於辨識多版本或別名。
whereis 指令
- 查詢內容:在特定系統目錄中同時找執行檔(binary)、手冊(man)、原始碼(source)。
- 選項:-b 只看 binary,-m 只看 man,-s 只看 source。
- 內建與外部差異:cd 為殼層內建通常無外部路徑;echo 同時有內建與外部版本;mv、rm 等為獨立可執行檔。
4. locate 系列:資料庫型超高速模糊搜尋
- 特性:以預建資料庫搜尋,速度極快、支援模糊關鍵字;準確度取決於資料庫新舊。
- 家族與發行版差異:mlocate、plocate、slocate、nlocate 等;不同發行版預設或套件名稱不同,近年偏好 plocate。部分版本(如 Ubuntu 20.04 之後)可能不預設安裝。
- 用法:locate cp 會列出含「cp」的大量結果;字越短越模糊、越多;字越特殊越精準。locate -c 可計數結果。
- 資料庫更新:updatedb 需定期或開機時更新;示範以 touch 建檔、updatedb 後 locate 才能找到;刪檔後未更新仍會顯示舊結果。
- 資料庫位置:通常在 /var/lib/locate(不同家族檔名不同)。不建議隨意刪除資料庫,系統排程或開機會重建。
find:精準條件搜尋
- 基本名稱搜尋:find 路徑 -name 'pattern' 於指定層級與路徑查特定字串或通配。
- 依時間搜尋:-atime(存取)、-ctime(inode 狀態變更/建立)可查最近分鐘或更細的條件;系統行為可能造成非手動的存取紀錄。
- 查空項目:-empty 可列出空檔案與空目錄;不建議隨意清除系統目錄中的空項目,以免破壞相容性。
- 依大小:-size +100K / -10K / 100K 等,常用於磁碟空間管理定位大檔。
- 限制深度與型態:-maxdepth 限制層級;-type d/l/b/s 等過濾不同型態;在 /var、/dev 等路徑分別可快速分類。
殼層補齊與萬用字元
- Tab 補齊:Bash、Zsh 支援;第一次嘗試補齊,第二次列出候選。指令與參數多有補齊,但依環境而異。
- 學習策略:初學者先練手打與目錄心智模型,待路徑與名稱清晰再以補齊提速;可刻意保留末兩字再按 Tab 以降低打錯風險。
- 星號(*):匹配任意字元任意長度;適合模糊但結果多。
- 問號(?):每個 ? 代表一字元;適合精準指定長度與字元位置的匹配。
大小寫敏感與跨平台注意
- Linux 大小寫敏感,ABC 與 abc 為不同檔;Windows 通常不敏感,同名不同大小寫視為同一檔。跨平台操作需特別留意,避免誤判或覆蓋。
課前準備與課程大綱
- 本節核心聚焦「檔案內容」處理,與上一節的檔案/目錄管理不同。
- 主要內容:
- 查看與瀏覽:查看與瀏覽檔案內容,並擷取部分內容。
- 切割與合併:將檔案切割與合併。
- 排序與統計:對檔案資料進行排序與統計(如行數、字數)。
- 打包與備份:類似微軟系統的壓縮/解壓,但在 Linux 中「打包」不必然包含「壓縮」。
- 輸入輸出與轉向:介紹基本 I/O 與各式轉向。
- 管線 (Pipe) 使用:深入管線細節與原理。
- 連續與條件式指令:同一行撰寫多個指令,依條件執行,適合不會寫程式的初期階段。
檔案內容打包與備份觀念
- 打包 vs. 壓縮
- 微軟系統常將備份目錄直接壓縮為單一檔案。
- 在 Linux 伺服器環境,備份大型目錄(如 2TB、10TB)時常選擇「只打包不壓縮」。
- 原因:還原巨大壓縮檔需大量 CPU 與時間,影響效能;只打包雖體積較大,但解開速度快、負擔小。
- 許多打包指令亦內建壓縮選項,使用者可視需求決定是否壓縮。
檔案內容查看指令
- CAT (Concatenate)
- 基本用法:cat [檔名],自檔案開頭至結尾輸出所有內容至螢幕。
- 常用選項 -n:cat -n [檔名],於每行前加上行號。
- 範例:cat tongue_name.taste。
- TAC (CAT 的倒序)
- 基本用法:tac [檔名],自最後一行開始反向輸出。
- 應用:適合查看日誌檔,因最新紀錄多在檔案末尾。
- 限制:不支援行號,但可透過管線搭配 nl。
- NL (Number Lines)
- 基本用法:nl [檔名],功能與 cat -n 相同,為每行加行號。
- 精簡系統考量:部分精簡系統可能移除 nl,因與 cat -n 功能重疊。
- 常用選項 -s:nl -s [分隔符號] [檔名],自訂行號與內容間的分隔符(預設空白)。
檔案內容分頁瀏覽工具
- MORE
- 基本用法:more [檔名],分頁瀏覽大型檔案。
- 操作特性:
- 可用上下左右鍵、Page Up/Page Down 翻頁。
- 搜尋(/)會跳至相符位置,但不標色。
- 到檔案末尾會自動結束並退出。
- LESS
- 基本用法:less [檔名],功能更強大的分頁瀏覽工具。
- 操作特性:
- 操作類似 more。
- 搜尋時會對關鍵字標色,便於辨識。
- 到檔案末尾不會自動退出,可回看先前內容。
- 講師偏好使用 less。
擷取部分檔案內容
- HEAD
- 功能:擷取檔案開頭內容。
- 預設:head [檔名] 取得前 10 行。
- 常用選項 -n:head -n [行數] [檔名],擷取指定行數(如 head -n 3)。
- 其他選項:
- -c [字元數]:擷取開頭指定字元數。
- -n -[行數] 或 -c -[字元數]:顯示全部內容,但排除結尾指定行數或字元數(較少見)。
- TAIL
- 功能:擷取檔案結尾內容。
- 常用選項 -n:tail -n [行數] [檔名],擷取指定結尾行數(如 tail -n 3)。
- 其他選項:
- -c [字元數]:擷取結尾指定字元數。
- -c +[字元數]:自第 N 個字元起顯示至檔案結尾(較少見)。
檔案內容排序與統計
- SORT (排序)
- 基本用法:sort [檔名],對內容逐行排序(預設字母順序)。
- 常用選項:
- -r:反向排序 (Reverse)。
- -t [分隔符號]:指定欄位分隔符,如 -t " " 以空白為分隔。
- -k [欄位編號]:依指定欄位排序。
- -u:去除重複行 (Unique),排序後僅保留一行。
- 應用:將 Excel 匯出的 CSV 交由 Linux 快速排序;自動化腳本中如排序網路流量找出最大值等。
- WC (Word Count)
- 功能:統計檔案內容。
- 基本用法:wc [檔名],輸出三組數字:行數、字詞數、字元數。
- 常用選項:
- -l:僅顯示行數 (Lines)。
- -w:僅顯示字詞數 (Words)。
- -m 或 -c:僅顯示字元數 (Characters),對純文字通常相同。
- -L:顯示最長一行長度。
- 組合應用:以管線將 sort -u 結果傳給 wc -l,統計去重後剩餘行數。
檔案打包與壓縮(tar、gzip/bzip2)
- tar 的基本概念與使用
- 在傳送多檔案(例如城市、小專案)情境下,將多個檔案或目錄「打包」成單一檔案以便傳輸;打包不等於壓縮,壓縮需額外指定。
- 常見於 GitHub 下載尾字:.zip、.tar;Linux 世界更常見 .tar 及其壓縮變體(如 .tar.gz/.tar.bz2)。
- 伺服器提供下載時,常同時提供未壓縮與壓縮版本。大型伺服器偏好未壓縮包,因為解包不需解壓縮,耗時較少。
- tar 常用選項與語法示例
- -c:建立打包檔(create),建立檔案時必選。
- -v:顯示打包或解包過程的檔案清單;不需要過程時可省略。
- -f:指定輸入/輸出檔名;在短選項合併時,-f 的參數必緊跟在最後一個選項之後。
- 來源可為多個目錄/檔案;示例將 etc 目錄打包為 etc.tar,示範檔案大小約 34MB(未壓縮)。
- Linux 副檔名主要「給人看」以理解內容類型;系統不仰賴副檔名決定開啟程式,與 Windows 不同。
- 壓縮選項與副檔名慣例
- -z:使用 gzip(講者口誤稱「GNULIP/gnu zip」);-j:使用 bzip2。兩者皆常見,使用者多偏向 gzip。
- 建議在檔名上表明雙重性質,如 etc.tar.gz(講者示例亦提到等同概念等如 etc.tar.gzip/gnip),利於人類辨識;指令多能自動識別壓縮格式,即使副檔名未標示。
- 範例:tar -czvf userData.tar.gz [來源A] [來源B];示範短選項可合併(如 -czvF)或拆開,但須遵守順序規則。
- 權限與錯誤訊息
- 以一般使用者打包系統目錄時,部分目錄可能因權限不足出現「Permission Denied」;這不是 -v 的正常輸出,而是錯誤訊息。以 root 帳戶示範時不會有此限制。
- 檢視打包內容(不解壓)
- 使用 tar -t(列出內容)配合 -f 指定檔案,顯示包內目錄/檔案結構;帶斜線的項目表示目錄。
- 短選項合併的順序規則:可為 -tf file.tar,但不可為 -ft file.tar;-f 是唯一帶參數的選項,參數需黏在最後一個選項後方。
- 解包與解壓縮
- 使用 -x:解包(可自動辨別是否壓縮);可加 -v 顯示過程,-f 指定檔案。
- 預設解至當前工作目錄;使用 -C 指定解至目標目錄(注意為大寫 -C)。示例解至 /tmp,解後檢視 /tmp 下出現 Home 目錄等內容。
Linux 與 Windows 的副檔名與檔案識別差異
- Windows 依副檔名決定開啟程式(如 .docx 由 Word 開啟);副檔名錯置時可能以不相符的程式嘗試開啟,出現「無法打開」。
- 講者補充:即使更改副檔名,Windows 有時仍依內容類型判斷並開啟原先適合的應用(講者評述「微軟偷機」),但核心觀念是 Windows 強依賴副檔名。
- Linux 副檔名僅供人類理解;系統以檔案內容與權限為主。故在 Linux 世界,.tar、.gz 等後綴多是「暗示」,人類易讀。
超過郵件附件限制的分割與合併(split、cat)
- 郵件附件大小限制背景
- 常見限制:單一檔案 3MB、5MB、10MB,Google 約 20MB。超過大小需分割檔案以便傳送。
- 在 Linux 操作流程通常是先打包/壓縮,再「後續」進行分割;不同於 Windows 某些工具在壓縮當下即指定分割大小。
- split 指令:依行數或大小分割
- 文字檔可用 -l(小寫 L)依行數分割;非文字檔應以大小分割(以行數分割非文字檔會有問題)。
- 後綴命名:預設產生 aa、ab、ac…;使用 -d 可改為數字 00、01、02… 的樣式,以符合 Windows 習慣。
- 大小單位:
** k, m, g:以 1024 為基底(KiB, MiB, GiB 概念)。 ** KB, MB, GB:以 1000 為基底(十進制)。 ** 硬碟容量顯示差異源於廠商採 1000、系統採 1024,導致格式化後容量看起來變小。
- split 文字檔範例(connect.txt)
- split -l 5 connect.txt connect.txt.split
- 產出 connect.txt.splitaa、.splitab、.splitac…;前兩檔各含 5 行(AA、AB),第 3 檔僅 1 行(總 11 行)。
- split 非文字檔範例(GNJLive.mp3)
- split -d -b 1M GNJLive.mp3 GNJLive.mp3.split
- -d 產生 00、01、02…;-b 指定分割大小,示例以 1MiB(若用 MB 則為 1,000,000 bytes)。
- 可用 ls -l 檢視各分割檔的大小與命名;使用萬用字元()一次列出。
- 分割後的合併(cat)
- 文字檔:cat connect.txt.splitaa connect.txt.splitab connect.txt.splitac > connect.txt.merge
- 注意順序:合併結果與原檔一致需依切割時的序列接回。
- 非文字檔:cat GNJLive.mp3.split > GNJLive.mp3.merge
- 萬用字元展開通常依字典序排序,00、01、02…可確保正確順序;若有 11、12…需依講義說明調整匹配以避免 1、10、11 排在 2 前的問題。
- 合併後可比對大小(ls -l),應與原始檔案一致;MP3 合併檔可用播放器測試播放(講者提及「9x1」播放器、DOS 上也可播 MP3 與看彩色圖片的歷史趣聞)。
其他壓縮工具與格式概覽
- gzip(gnuzip)、bzip2(bunzip)、compress、bzlip(講者口誤混用字眼)、xz 等皆為常見壓縮工具;xz 早期亦有 DOS 版本。
- Windows 常見:RAR、ZIP;早期:ARJ、LHA;講者於 YouTube 有相關教學錄影(關鍵字 IR 或 LIP/ZIP)。
- 壓縮格式與副檔名對應
- 副檔名常反映壓縮工具與格式;遇到陌生格式可上網查詢,課程允許並鼓勵查詢。
- tar 與 gzip 的關係
- gzip 本為獨立軟體;tar 後來整合壓縮功能,故可直接使用 tar -z 產出 .tar.gz,無需先 tar 再 gzip。
管線、輸出導向與標準輸入輸出(引介)
- 在列出 tar 內容過多時,可配合管線做分頁顯示(例如 pipe 至分頁工具);本節作為後續「標準輸入輸出」章節的引入。
- 本次已示範「輸出導向」(>)用於合併檔案;後續課程將系統性講解標準輸入、標準輸出與管線的意義與用法。
標準輸入輸出基礎
- 標準 I/O 的定義
- 每個在 Linux 中執行的程式(如 ls)都有「一個標準輸入」與「兩個標準輸出」。
- 標準輸入 (Standard Input / stdin):程式接收資料的來源,預設為鍵盤;在圖形介面(GUI)中,滑鼠也可視為一種輸入。
- 標準輸出 (Standard Output / stdout):程式顯示正常執行結果的地方,預設為螢幕。
- 標準錯誤輸出 (Standard Error Output / stderr):程式顯示錯誤訊息的地方,預設亦為螢幕。
- 區分標準輸出與錯誤輸出
- 儘管兩者預設都顯示在螢幕上,仍可由訊息內容加以辨識。
- 範例:執行 ls -l CAT /etc/passwd
- CAT 不存在,系統顯示 ls: cannot access 'CAT': No such file or directory,屬於標準錯誤輸出 (stderr)。
- /etc/passwd 存在,系統列出其詳細資訊,屬於標準輸出 (stdout)。
- I/O 的可轉向特性
- 標準輸入、標準輸出與錯誤輸出的目的地可被改變。
- 輸入可由鍵盤改為檔案。
- 輸出與錯誤輸出可由螢幕轉向到檔案或其他裝置(如印表機),此時螢幕不再顯示訊息。
輸出轉向
- 標準輸出轉向 (>)
- 使用 > 將指令的標準輸出寫入檔案而非螢幕。
- 特性:覆蓋模式。若檔案存在,原內容會被清除後覆寫;若不存在,會自動建立。
- 範例:cat ~/.bashrc > bashrc.backup 將 .bashrc 內容寫入 bashrc.backup,螢幕無輸出;重複執行,檔案大小不變,因為每次覆蓋。
- 標準輸出附加轉向 (>>)
- 使用 >> 將標準輸出「附加」在檔案末尾。
- 特性:累加模式。不存在則建立;存在則在末尾新增,不清除原內容。
- 範例:date >> date.log,每次執行都把日期時間累加至 date.log,常用於日誌。
- 錯誤輸出轉向 (2>)
- 使用 2> 將標準錯誤輸出寫入檔案;數字 2 代表 stderr(檔案描述符 2)。
- 說明:stdin、stdout、stderr 對應的檔案描述符分別為 0、1、2;因此 > 等同 1>,0< 代表標準輸入轉向。
- 應用:在腳本中可將錯誤訊息導向日誌,避免打擾使用者並利於除錯。
- 範例:cd /CAT 2> error.log,因 /CAT 不存在,錯誤訊息寫入 error.log,螢幕不顯示。
- 錯誤輸出附加轉向 (2>>)
- 使用 2>> 將標準錯誤輸出「附加」到檔案末尾。
- 範例:對會產生錯誤的指令使用 2>> error.log,每次的錯誤訊息都累加至檔案。
- 合併輸出轉向 (&>)
- 使用 &> 將「標準輸出」與「標準錯誤輸出」同時重定向到同一檔案。
- 適用於需要完全靜默(不在螢幕顯示任何結果或錯誤)的情境。
- 同樣提供附加模式 &>>,可累加所有輸出。
輸入轉向
- 標準輸入轉向 (<)
- 使用 < 將檔案內容作為指令的標準輸入,取代鍵盤輸入。
- 範例比較:
- head -n 3 namelist.txt:head 直接讀取檔案。
- head -n 3 < namelist.txt:head 從標準輸入讀取,而標準輸入被重定向為檔案內容。
- 兩種寫法結果相同,但內部處理流程不同。
- Here Document (即時文件)
- 使用 << 配合「終止識別符」在命令列提供多行輸入,常用於快速建立簡單檔案。
- 語法:command << TERMINATOR,輸入多行內容,直到新的一行單獨輸入 TERMINATOR 結束。
- 範例:cat > stdio.txt << END,輸入多行文本,最後單獨輸入 END 結束;所有內容寫入 stdio.txt。
- 注意:終止識別符所在行必須只有該識別符,不能包含其他字元或空白。
- 精簡寫法:cat > file.txt,不使用 Here Document,按 Enter 後直接輸入,使用 Ctrl+D 結束,亦可達成類似效果。
管線 (Pipe)
- 定義與功能
- 管線符號為 |,可將前一個程序(指令)的「標準輸出 (Standard Output)」導向下一個程序的「標準輸入 (Standard Input)」。
- 僅處理標準輸出,不處理錯誤輸出 (Error Output)。
- 使用範例與目的
- 範例 1: ls -l | nl
- ls -l 以行列格式輸出目前目錄內容(標準輸出)。
- 管線將 ls -l 的輸出傳給 nl。
- nl 為輸入內容加上行號後再輸出,便於閱讀與參照。
- 範例 2: [command] --help | less
- --help 輸出通常篇幅較長,超出單頁。
- 透過管線將輸出交給 less 分頁瀏覽,方便查看完整說明。
- 組合應用
- Linux 指令多為單一職責;藉由管線組合不同指令,可完成更複雜任務。例如一個指令產生資料,另一個指令負責處理或過濾。
grep 指令
- 基本功能
- 用於在檔案內容中搜尋關鍵字。
- 以「行」為單位進行搜尋;若某行包含關鍵字,grep 輸出該整行。
- 匹配到的關鍵字會以特殊顏色標示,利於辨識。
- 常用參數
- -i: 忽略大小寫 (Ignore case)。例如搜尋 "Peter" 加上 -i 時,"peter" 也會被匹配。
- -n: 在每行輸出前顯示原始檔案的行號。
- -w: 完整單詞匹配 (Whole word match)。如搜尋 b,未加 -w 時 abcd 會被匹配;加上 -w 則僅匹配獨立單詞 b(前後有空白)。
- -c: 統計符合關鍵字的行數 (Count),只輸出計數數字。撰寫腳本時可用於條件判斷。
指令串接
- 連續指令 (Sequential Commands)
- 以分號 (;) 作為指令分隔。
- 指令依序執行(指令1完成後執行指令2,依此類推)。
- 特性:即使前一個指令失敗(如拼字錯誤或找不到目錄),後續指令仍「無條件」執行。使用時須確保每個指令正確,以避免意外(如誤刪檔案)。
- 應用場景:多步驟且彼此無依賴性時可寫在同一行,例如先執行耗時編譯,再執行程式,最後以 email 寄出結果,以實現自動化流程。
- 條件式指令 (Conditional Commands)
- && (AND)
- 語法:指令1 && 指令2
- 邏輯:僅在「指令1成功」時才執行「指令2」;若指令1失敗,指令2不執行。
- 範例:cd /sys && ls。若成功切換至 /sys,則執行 ls;若目錄不存在導致切換失敗,ls 不會執行。
- 應用:有相依性的任務,例如編譯成功後才執行程式。
- || (OR)
- 語法:指令1 || 指令2
- 邏輯:僅在「指令1失敗」時才執行「指令2」;若指令1成功,指令2不執行。
- 範例:ls /etc/host || ls /etc/host。若找不到 /etc/host(指令失敗),則改執行 ls /etc/host 列出所有以 host 開頭的檔案。
- 應用:提供備援或錯誤處理,例如主要指令失敗時執行回報或替代方案。
其他概念
- 錯誤輸出重導向
- 透過 2> /dev/null 將錯誤訊息導向 null 裝置(記憶體空區),避免在螢幕顯示錯誤。
- 補充指令
- uniq: 用於統計重複行等用途,但前提是資料需先排序 (sorted)。講師列為補充內容,建議有興趣者自行研究。
- 檔案系統刪除機制
- Windows: 刪除檔案時,系統在檔案目錄(索引)標記「已刪除」,實際資料區塊未立即清除。只要未被新資料覆蓋,救援軟體可透過索引找回原始檔名與內容。
- Linux: 刪除檔案時,會直接釋放對應資料區塊(具體機制於後續章節說明),使檔案難以救回。市面上也較少專門救援 Linux 檔案系統的軟體。