---
# System prepended metadata

title: 那些你不能不會的 Linux 基礎指令！（下）
tags: [Linux, 電腦雜談, 計算機概論, 電腦]

---

# 那些你不能不會的 Linux 基礎指令！（下）

[TOC]

感謝您點進本篇文章，我是 LukeTseng，近期接觸到 Linux 系統，時常需要面對黑色終端機，有些時候想做到一些操作，卻也不知道那個指令叫什麼，我也沒有好好奠基 Linux 的基礎指令，所以特此製作本篇文章！希望能解決到你我的痛點！

若本篇文章某處有誤，敬請告知，感謝！

## 萬用字元（Wildcard）

最常見的就是 `*` 跟 `?` 這兩個字元。

`*` 代表「任意長度的任意字元」，可以是 0 個、1 個或多個字元。

範例如下：

- `ls *`：列出目前目錄下所有非隱藏檔案。

以下是 `ls *` 跟 `ls` 的差別：

![image](https://hackmd.io/_uploads/BJjRzyz0xg.png)

- `ls *.txt`：列出所有副檔名為 `.txt` 的檔案（如 `a.txt`、`b.txt`）。

![image](https://hackmd.io/_uploads/ByD_7kzAxl.png)

- `ls a*`：列出所有以 `a` 開頭的檔案（如 `apple`、`a.txt`）。

![image](https://hackmd.io/_uploads/BJoTX1GAex.png)

- `ls *a*`：列出所有檔名裡面有包含 `a` 這個字元的檔案。

下圖中使用 `ls *a*` 就找到 `abcdefg`、`alphafile` ... 以及 snap 目錄底下的 `firmware-updater` 跟 `snapd-desktop-integration` 檔案。

![image](https://hackmd.io/_uploads/BkYbNkz0xx.png)

---

`?` 代表「任意一個字元」，只能匹配一個字元。

如：

- `ls ?.txt`：列出所有檔名只有一個字元且副檔名為 `.txt` 的檔案（如 `a.txt`、`b.txt`）。

像以下的 `ab.txt` 就沒有被印出來，但 `a.txt`、`b.txt` 是有的，因為 `?` 只匹配單一一個字元而已，除非你再多加一個 `?` 字元，如下面第二張圖。

![image](https://hackmd.io/_uploads/HkNzH1zCxl.png)

以下這張圖再多加一個 `?`，變成 `ls ??.txt`，結果只會顯示一個檔案 `ab.txt`，因為 `a.txt` 跟 `b.txt` 的檔名沒有恰含有兩個的字元。

![image](https://hackmd.io/_uploads/B1WFH1z0gx.png)

- `ls file?.txt`：列出像 `file1.txt`、`fileA.txt` 這種檔案，但不會匹配到 `file10.txt`。

以下不會顯示 `file100.txt` 跟 `file10.txt` 檔案。

![image](https://hackmd.io/_uploads/H1-7LJG0xl.png)

其他範例：

- `rm *.png`：刪除所有副檔名為 `.png` 的檔案。
- `cp file?.txt backup/`：複製所有像 `file1.txt`、`fileA.txt` 這類檔案到 `backup` 目錄。

---

有關這個萬用字元，以下有幾個注意事項：

- `*` 和 `?` 不會匹配以 `.` 開頭的隱藏檔案，除非明確指定。
- 若要讓這些符號失去特殊意義（像是真的要找檔名有 `*` 或 `?`），可用反斜線 `\` 做為跳脫字元，例如 `ls \*`。

## 搜尋類型指令

### which

`which` 是 Linux 中用於查找可執行檔（`.exe`）路徑的工具，會根據環境變數 PATH 的設定，搜尋並顯示指令的完整路徑。

基本語法：

```bash
which [options] executable_file
```

常用參數：

- `-a` 或 `--all` 選項可以列出 PATH 中所有匹配的指令。
- `-V` 或 `--version` 選項用於顯示版本資訊。

相關範例：

- 查找 bash 執行檔在哪裡：`which bash`
    - 結果：`/usr/bin/bash`
- 查找多個路徑：`which -a python3`

```bash
/usr/bin/python3
/bin/python3
```

### find

`find` 顧名思義就是拿來搜尋某個檔案用的。

基本語法：

```
find [path] [options] [condition]
```

會在 path 路徑當中，尋找符合 condition（條件）的檔案。

#### 依檔名搜尋

使用 `-name` 參數。

`find . -name abc.txt` 會在當前目錄下找尋檔案名稱為 `abc.txt` 的檔案。

若要不區分大小寫，可以使用 `-iname` 參數，如：`find /home -iname abc.txt`。

檔名中可以使用萬用字元 `*`，如：`find ./ -name "*foo*"` 會找出包含 `"foo"` 關鍵字的所有檔案。

以下是 `find . -iname "file*.txt"` 的範例示圖，會在當前目錄（`.`）中尋找所有 `file` 開頭的 `.txt` 檔案。

![image](https://hackmd.io/_uploads/Hky_2lGRgl.png)

#### 依檔案型態搜尋

使用 `-type` 參數。

- `-type f` 表示只搜尋一般檔案。
- `-type d` 表示只搜尋目錄。

而上述其他可用的類型還包括：`l`（符號連結）、`b`（區塊裝置）、`c`（字元裝置）、`p`（管道）、`s`（socket）。

範例：

- `find ./ -name "*foo*" -type f` 會找出檔名包含 `"foo"` 的所有檔案。

#### 依檔案大小搜尋

使用 `-size` 參數，`+` 表示大於、`-` 表示小於，如 `find ./ -size +500M` 會找出所有大於 500 MB 的檔案。

常用單位：

- c（bytes）
- k（Kilobytes）
- M（Megabytes）
- G（Gigabytes）

範例：

- `find ./ -name "*.jpg" -size -160k -delete` ，找出並刪除 < 160k 的 .jpg 照片。

#### 依時間搜尋

- `-mtime`、`-mmin` 參數搜尋檔案的「修改」時間（天和分鐘）
- `-ctime` 和 `-cmin` 參數分別搜尋檔案的「建立」時間（天和分鐘）
- `-atime` 和 `-amin` 參數分別搜尋檔案的「最後開啟」時間（天和分鐘）

範例：

- `find ./ -type f -mmin -5` 會找出 < 5 分鐘以內變動過的所有檔案。
- `find ./ -mtime -3` 找出 < 3 天內修改的檔案。
- `find ./ -mtime +3` 則是找出 > 3 天前修改的檔案。

#### 實際應用

像是你想要清理系統中超過 7 天沒有使用的暫存檔，可用：`find /tmp -type f -atime +7 -delete`

## 字串處理指令

### cat

`cat` 是來自英文 concatenate 中取 `cat` 的縮寫，用來一次性顯示檔案內容、合併檔案，或建立新檔案的指令。

用法：

- `cat file_name`：顯示整個檔案內容。
- `cat file1 file2 > newfile`：合併 `file1` 和 `file2`，輸出到 `newfile`。
- `cat > newfile`：從鍵盤輸入內容，Ctrl+D 結束並儲存。

裡面的 `>` 符號表示輸出重新導向（Output Redirection）的意思，用於將指令的執行結果輸出到檔案中，而非顯示在終端機上。

常用參數：

- `-n`：顯示行號。
- `-b`：只對非空行編號。
- `-s`：壓縮多個空行為一行。

範例：

```bash
cat test.txt
cat file1.txt file2.txt > merged.txt
cat -n test.txt
```

以下是 `cat test.txt` 的範例圖，會從 `test.txt` 擷取所有文字，並輸出在終端機上面。

![image](https://hackmd.io/_uploads/Hk5T0-zAxg.png)

以下是 `cat file1.txt file2.txt > merged.txt` 的範例圖，由於原本 `cat` 會將文檔內容輸出在終端機上嘛，所以透過 `>` 可以將輸出的內容輸出到某個檔案上面。

![image](https://hackmd.io/_uploads/HySPJzf0ee.png)

以下是 `cat -n test.txt` 的範例圖，加上 `-n` 參數可以顯示行數。

![image](https://hackmd.io/_uploads/B1xWxzM0xe.png)

### more

`more` 與 `cat` 是類似的東西，另外 `more` 也沒有什麼英文縮寫，`more` 就是 `more`。而他跟 cat 的差別在於 `more` 可以分頁顯示檔案內容，適合查看大型檔案。

用法：`more file_name`。

常用操作：

- 空白鍵：下一頁。
- Enter：下一行。
- `/string`：搜尋字串，其中 `string` 是要拿來填寫的字串。
- `q`：退出。
- `v`：進入 vi 編輯器。

以下是 `more bbc_new.txt` 的範例，內容均擷取自新聞：https://www.bbc.com/news/articles/c87400e3j5eo

![image](https://hackmd.io/_uploads/HJqLQfzAel.png)

出現 `--More--(24%)` 的訊息可以按下空白鍵往下一頁：

![image](https://hackmd.io/_uploads/SJTY7MG0xg.png)

### grep

`grep` 是取自英文 global regular expression print 的縮寫，是用來搜尋檔案中符合條件的字串，當中支援正規運算式（Regex：regular expression）。

用法：

- `grep 'string' file_name`：搜尋檔案中包含指定字串的行。
- 常結合 `cat` 跟管道（pipe）符號：`cat file_name | grep 'string'`。

管道符號是 `|`，在鍵盤的 `]` 右中括號的右邊，也寫著反斜線的符號，`shift + \` 就可以打出來。

管道符號（`|`）是 Linux 中將一個指令的輸出直接傳遞給另一個指令作為輸入的特殊符號，所以可以看到 `cat file_name | grep 'string'` 的地方，`grep` 後面就不需要再加上 `file_name` 了，因為前面 `cat file_name` 就當成是他的輸入。

grep 常用參數：

- `-i`：忽略大小寫。
- `-v`：反向選取，不包含字串的行。
- `-n`：顯示行號。
- `-w`：精確匹配整個字。
- `-r`：遞迴搜尋目錄。
- `-A N`：顯示匹配行及後 N 行。
- `-B N`：顯示匹配行及前 N 行。
- `-C N`：顯示匹配行及前後 N 行。

相關範例：

- `grep 'root' /etc/passwd`

使用 `grep` 會找出相對應的字串，找到的話會顯示紅字，白字為符合條件字串所在的行。

![image](https://hackmd.io/_uploads/HyK2IfzAlx.png)

- `grep -i 'error' log.txt`

`-i` 為不分大小寫。`grep` 可以在大量的詞海裡面找出相對應的字串，非常方便。

![image](https://hackmd.io/_uploads/rJGsvfzAgx.png)

- `grep -n 'main' *.c`

`-n` 參數為字串所在顯示行數，以下動作就在 `.c` 檔案中要找到 `main` 字串，顯示於 `a.c` 檔案中的第三行。

![image](https://hackmd.io/_uploads/HkSpOfzRel.png)

- `cat test.txt | grep 'hello'`

結合管道符號來做字串過濾的範例如下。

從 `cat test.txt` 輸出的內容傳遞給 `grep` 作為輸入的參數做使用，效果等同於 `grep 'hello' test.txt`

![image](https://hackmd.io/_uploads/rJKrtfG0gl.png)

### head

`head` 指令是 Linux 中用來顯示檔案「前幾行」內容的工具。

`head` 預設顯示檔案的前 10 行，如：`head filename.txt` 會印出 filename.txt 的前 10 行。

若要指定行數可這樣寫：`head -n 5 filename.txt`，或簡寫 `head -5 filename.txt`。

也可顯示多個檔案的開頭內容：`head file1.txt file2.txt`。

顯示前 N 個位元組（bytes）：`head -c 20 filename.txt`，顯示前 20 個 bytes。

### tail

有 `head` 就會有 `tail`，`tail` 可顯示文字檔的後幾行內容，預設是顯示後十行的內容。

使用方法與 `head` 相同。

### wc

`wc` 可不是廁所哦XD，`wc` 的英文全名是 word count，在 Linux 中用來統計檔案內容的行數、字數、字元數、位元組數等的基本指令。

功能：

- 計算行數（lines）
- 計算字數（words）
- 計算字元數（characters）
- 計算位元組數（bytes）

語法：

```
wc [options] file_name
```

若不指定檔案，`wc` 會從標準輸入讀取資料。

常用參數：

- `-l`：只顯示行數。
- `-w`：只顯示字數。
- `-c`：只顯示 byte 數。
- `-m`：只顯示字元數。
- `-L`：顯示最長行的長度。

相關範例：

- `wc test.txt`，計算檔案的行數、字數、位元組數。

輸出格式：`行數 字數 位元組數 檔案名`

![image](https://hackmd.io/_uploads/rySu6XzRex.png)

- `wc -l test.txt` 只顯示行數。

![image](https://hackmd.io/_uploads/SkscTQzCel.png)

- `wc -w test.txt` 只計算字數。
- `wc -c test.txt` 只顯示字元數。
- `grep 'error' log.txt | wc -l`，統計 `log.txt` 中包含 `"error"` 的行數。

## 重新導向（redirect）工具

`>`、`<`、`>>` 這三個符號都是在 Linux 中做重新導向的工具，可以將指令的輸出或輸入改變方向。

### >

`>` 大於符號為輸出重導向（覆蓋），功能是將指令的「標準輸出」（stdout）寫入指定檔案，覆蓋原有內容。

範例：`cat test.txt > result.txt`

上面的指令會把 `test.txt` 的內容寫到 `result.txt`，原本的 `result.txt` 會被覆蓋（`result.txt` 會被清空，然後再把 `test.txt` 的文本輸出到 `result.txt` 上面去）。

下圖展示了這個指令使用前後的效果：

![image](https://hackmd.io/_uploads/ry-ghfz0ge.png)

### >>

這個指令也是輸出重導向，但是跟 `>` 不同的是，`>>` 會追加在文檔後面，而非直接覆蓋掉所有內容。

範例：`cat test.txt >> result.txt`

下圖展示了這個指令使用前後的效果：

![image](https://hackmd.io/_uploads/Sy6hnMzCgg.png)

### <

`<` 是輸入重導向，用於將檔案內容作為指令的「標準輸入」（stdin）來源，取代原本的鍵盤輸入。

範例：`cat < test.txt`

這個指令等同於 `cat test.txt`，因為 `<` 就是在讀取檔案內容。

下圖展示了指令的使用效果：

![image](https://hackmd.io/_uploads/ry7IaGzCxe.png)

## Linux 版工作管理員

### ps

首先介紹 ps 指令，ps 的全名是 process status，用來顯示目前系統中正在執行的程序（process）狀態。類似 Windows 的工作管理員，可以讓你查詢系統上所有或特的程序資訊，包括程序 ID、使用者、資源佔用、啟動時間等。

若單一輸入 `ps` 指令，只會顯示「目前這個終端機」下執行的程序，不包含其他使用者或背景服務。輸出通常包含欄位：

- PID（程序 ID）
- TTY（終端機）
- TIME（CPU 使用時間）
- CMD（指令名稱）

![image](https://hackmd.io/_uploads/Sy4s8Qz0ex.png)

### ps aux

`ps aux` 這一串指令是最常用的程序查詢組合之一，能夠列出所有 user 的所有程序，並顯示詳細資訊。這個組合的三個選項分別代表：

- `a`：顯示所有使用者的程序（不只自己的）
- `u`：以「使用者為主」的格式顯示，包含 `USER`、`%CPU`、`%MEM` 等欄位
- `x`：顯示沒有控制終端機（TTY）的程序（例如系統服務）

輸入 `ps aux` 可能會出現以下畫面：

![image](https://hackmd.io/_uploads/r1W6UQMAxg.png)

### 結合 grep 過濾特定條件

範例指令：`ps aux | grep root`。

輸入後會呈現下圖資訊，會從 `ps aux` 中找出所有 `root` 的程序：

![image](https://hackmd.io/_uploads/HJr7wmGRxe.png)

## 總整理

### 萬用字元（Wildcard）

星號（`*`）代表任意長度的任意字元（包括零個），如 

- `ls *.txt` 列出所有 `.txt` 檔案。
- `ls *a*` 找出檔名包含字母 `a` 的所有檔案。

問號（`?`）只匹配單一字元，如

- `ls ?.txt` 只列出檔名為一個字元的 `.txt` 檔案（如 `a.txt`）
- `ls ??.txt` 則列出檔名恰好兩個字元的檔案（如 `ab.txt`）。

萬用字元不會匹配以點（`.`）開頭的隱藏檔案，除非明確指定，若要搜尋檔名真的包含 `*` 或 `?` 符號，需使用反斜線 `\` 做跳脫字元。

### 搜尋類型指令

- `which` 指令用於查找可執行檔的完整路徑，根據環境變數 PATH 進行搜尋，
    - 範例：`which bash` 會顯示 `/usr/bin/bash`，加上 `-a` 參數可列出所有匹配的路徑。
- `find` 可依檔名（`-name`）、檔案類型（`-type`）、大小（`-size`）、時間（`-mtime`、`-ctime`、`-atime`）等條件搜尋檔案。
    - 範例：`find . -name "*.txt"` 找出當前目錄下所有 `.txt` 檔案。

### 字串處理指令

- `cat` 指令源自 concatenate，用於顯示檔案內容或合併檔案。
    - 範例：`cat file1.txt file2.txt > merged.txt` 將兩個檔案合併輸出給 `merged.txt`
    - `cat -n test.txt` 顯示行號。
- `more` 指令用於分頁顯示大型檔案，按空白鍵翻頁，按 Enter 往下一行，輸入 `/string` 可搜尋字串，按 q 退出。
- `grep` 指令是 global regular expression print 的縮寫，用於搜尋檔案中符合條件的字串，支援正規運算式。
    - 常用參數：
        - `-i`（忽略大小寫）
        - `-n`（顯示行號）
        - `-v`（反向選取）
        - `-r`（遞迴搜尋）
    - grep 常結合管道符號（`|`）使用，如 `cat test.txt | grep 'hello'` 等同於 `grep 'hello' test.txt`。
- `head`、`tail` 指令分別顯示前幾行跟後幾行的文字，`-n numbers` 可以調整要顯示的行數。
- `wc` 全名為 word count，計算用來統計檔案內容的行數、字數、字元數、位元組數。 

### 重新導向工具

- 大於符號（`>`）將指令輸出寫入檔案並覆蓋原有內容，如 `cat test.txt > result.txt`。
- 雙大於符號（`>>`）將輸出追加到檔案末端而不覆蓋，如 `cat test.txt >> result.txt`。
- 小於符號（`<`）將檔案內容作為指令的輸入來源，`cat < test.txt` 等同於 `cat test.txt`。

### 程序管理工具

`ps` 指令全名為 process status，用於顯示系統中正在執行的程序狀態，類似 Windows 工作管理員。

單獨輸入 `ps` 只顯示當前終端機下的程序，含 PID（程序 ID）、TTY（終端機）、TIME（CPU 使用時間）、CMD（指令名稱）等欄位。

`ps aux` 指令是最常用的組合，列出所有使用者的所有程序及詳細資訊。其中 `a` 顯示所有使用者的程序，`u` 以使用者格式顯示（包含 `USER`、`%CPU`、`%MEM` 等欄位），`x` 顯示沒有控制終端機的程序（如系統服務）。

結合 `grep` 可過濾特定條件，如 `ps aux | grep root` 找出所有 `root` 使用者的程序。

## 參考資料

[【Linux】一步一步学Linux——which命令(45)_linux which命令详解-CSDN博客](https://blog.csdn.net/dengjin20104042056/article/details/96118987)

[Linux which 指令](https://www.hy-star.com.tw/tech/linux/comm/which.html)

[Unix/Linux 的 find 指令使用教學、技巧與範例整理 – G. T. Wang](https://blog.gtwang.org/linux/unix-linux-find-command-examples/)

[在 Linux 下使用 find 指令查詢目錄與檔案的速查筆記 | The Will Will Web](https://blog.miniasp.com/post/2010/08/27/Linux-find-command-tips-and-notice)

[Day17-wildcard 萬用字元（一） - iT 邦幫忙::一起幫忙解決難題，拯救 IT 人的一天](https://ithelp.ithome.com.tw/articles/10223904)

[Linux常用命令：find、grep、vim、cat、less、more_less和vim-CSDN博客](https://blog.csdn.net/wszzr999/article/details/130879142)

[Linux系统介绍（五）常用命令 - 窗外蟋蟀博客](https://keysaim.github.io/post/linux/2017-11-17-linux-study-common-tools/)

[linux >和>>的区别,<号使用_linux >>-CSDN博客](https://blog.csdn.net/wenxuechaozhe/article/details/52564394)

[Linux常用指令之——ps aux-CSDN博客](https://blog.csdn.net/weixin_42338901/article/details/130846988)

[鳥哥私房菜 - 第 5 堂課：權限應用、程序之觀察與基本管理](https://linux.vbird.org/linux_basic_train/centos8/unit05.php)