---
# System prepended metadata

title: Linux 指令教學

---

🐧 Linux 指令教學
===

## 作業系統 Operating system

![](https://i.imgur.com/YbhK1oG.png =70%x)

- 硬體 (Hardware)：整個系統的實體工作者。
- 核心 (Kernel)：內部的核心，聽完Shell的翻譯，再指示硬體要進行的工作。
- 殼層 (Shell)：使用者與核心的溝通橋樑。負責接收使用者的訊息，再翻譯給Kernel。
- 使用者：將需求或想做的事輸入給Shell（就是你和我）。

### 常見的作業系統
- macOS 
- Linux
- Windows
- Android

![](https://preview.redd.it/linux-meme-i-found-v0-py9zhj2wkw2b1.jpg?auto=webp&s=559ea9888a12e4bdc18b6cd2313d594df362c8c0 =50%x)
:::warning
*切入正題！！！*
*今天要講的是**Linux**（的指令而已啦* :penguin::penguin::penguin:
:::

## Linux 作業系統架構

:::warning
*在開發環境上，Linux是比較具有優勢的～*
:::

- **For Mac users**：因為macOS跟Linux的基礎都是跟Unix操作系統有關，所以在Mac上是可以用Linux指令的～
- **For Windows users**：完全是不同的作業系統，所以會用不同的指令。
    - 可以安裝 **WSL** (Windows Subsystem on Linux)
    - 接著在命令提示字元中輸入 `wsl` 或 `bash` 就可以進入Linux系統了


:::warning
**Shell有分為：**
*:penguin: 圖形化使用者介面 (Graphical User Interface, GUI)*
*:penguin: 指令介面 (Command-Line Interface, CLI)*
**Linux比較常用CLI**
:::
![](https://cdn.mindmajix.com/blog/images/linux-0203-1919.png =50%x)

- Shell：有不同的版本，常見的有`bash, Zsh, Csh, Fish`。不同的shell會有一些不同的進階指令，可以做到更多樣的功能
- Utilities: 是基本的功能或工具，也就是本日主角 ---- 各種指令

打開Terminal，看看自己是使用哪個shell
```
echo $SHELL  # 預設的shell
echo $0      # 當前所在的shell
```
查看你有哪些shell
```
cat /etc/shells
```
更改shell（一次性）
```
zsh
bash
fish
```
更改預設的shell
```
chsh -s /bin/bash
chsh -s /bin/zsh
```


***:penguin: `/etc/shells` 跟 `/bin/zsh` 到底是啥？***

## Linux 檔案系統架構

![](https://www.runoob.com/wp-content/uploads/2014/06/d0c50-linux2bfile2bsystem2bhierarchy.jpg)

:::warning
*macOS 跟 Linux 還是有點差異啦*
:::
- `/` 根目錄
- `/bin` 一般使用者可以操作的指令，連結到 `/usr/bin`
- `/sbin` 系統管理員可以操作的指令，連結到 `/usr/sbin`
- `/etc` 系統設定檔
- `/var` 記載著各種系統上的變數
- `/usr` 全名為 unix software resource，放置系統相關軟體、服務
- `/tmp` 全名為 temporary，放置暫存檔案（雜七雜八的東西）
- `/opt` 全名為 optional，通常為第三方廠商放置軟體處
- `/Users` 裡面會有你的用戶資料夾（又稱家目錄`~`），類似Linux的 `/home`

```
cat /etc/shells  # 表示shell有紀錄在 /etc 底下的 shells 裡面
```

## Linux 指令

### Navigation 相關

#### pwd
> Windows `cd`

print working directory 顯示當前工作目錄
```
pwd
```
#### cd 
change directory 改變目錄

```
cd <絕對/相對路徑>

cd ..          # 回到上一個路徑
cd ../example  # 回到上一個路徑並去到example目錄
```



#### ls
> Windows `dir`

list 列出檔案
```
ls  # 列出當前工作目錄底下的檔名
ls <目錄>  # 列出該工作目錄底下的檔名

ls -l     # 顯示檔案的詳細資訊
==output==

權限      底下的目錄＆檔案            大小            檔名        
drwx------@  7 zhangzhifen  staff  224 11 2 22:50 W8
                所有者        群組       最後編輯時間
```
會有一些（.開頭的）隱藏檔案
```
ls -a   # 隱藏檔案也列出

# 顯示包含隱藏檔案的所有檔案詳細資訊
ls -al
ls -la 
ll

ls -R   # 也列出子資料夾內的所有檔案及資料夾內容
```


#### open 
打開圖形介面的資料夾或檔案
```
open .  # .代表目前所在的位置
open <檔案> 
```


### File 相關

#### mkdir 
建立工作目錄
```
mkdir <資料夾名稱>
mkdir -p dir1/dir2/dir3  # 創建多層目錄
```

#### touch
> Windows `echo. >` 

創建文件
```
touch <文件名稱>
touch aa.txt bb.txt cc.txt  # 創建多個文件
```


#### cp
> Windows `copy`

copy 複製檔案
**參數**
`-r`：整個資料夾
`-f`：強制執行
`-i`：會先詢問再執行
`-p`：將檔案本身屬性（權限、所有者、時間）同時複製過去，一般用於備份居多
`-s`：複製成捷徑檔
```
cp <檔案> <目的>
cp aa.txt ~/Desktop  # 可以放到一個路徑底下 
cp aa.txt newaa.txt  # 也可以創建一個新的複製檔案
```
如果要複製到已存在的檔案
```
cp aa.txt bb.txt     # 會直接覆寫
cp aa.txt >> bb.txt  # 會附加在bb.txt的尾端
```


#### rm
> Windows `del`

remove 刪除檔案
**參數**
`-r`：整個資料夾
`-f`：強制執行
```
rm <檔案>
rm -r <資料夾>    # 刪除資料夾
rm -f <檔案>     # 強制刪除（避免一些確認提示）
rm -rf <資料夾>  # 強制刪除資料夾
```



![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR8bxMDIiZSpmwuOIfUu1KmuacChGL0V-rZ8A&s)

#### mv
> Windows `move`, `ren`

move 移動檔案 or 改檔案名字
**參數**
`-v`：做完移動之後顯示所做的移動
```
mv <檔案> <目的> 
mv <原名稱> <新名稱>

# 如果要往外移出一層目錄的話
mv <檔案> <../>

# 如果要移出兩層
mv <檔案> <../../>

mv -v aa.txt ../  # 輸出：aa.txt -> ../aa.txt
```


#### cat & more & less
> Windows `type`

查看檔案
```
cat <文件名稱>
more <文件名稱>
less <文件名稱>
```
- `cat` 會一次性將內容印出來，因此適合較小的文件
- `more` 支援翻頁，用空白格可以跳到下一頁，但不能往回翻。支援向前搜尋`/pattern`，使用`q`退出。
- `less` 比`more`更靈活
    - 空白格跳到下一頁
    - `b` 回到前一頁
    - `/pattern` 向前搜尋
    - `?pattern` 向後搜尋
    - `g` 跳轉到開頭
    - `G` 跳轉到結尾
    - `q` 退出


#### find
尋找檔案位置

**參數**
`-name`：指定檔案（目錄）名稱
`-iname`：不區分大小寫
`-size`：指定檔案（目錄）大小
`-mtime`：存取、修改天數
`-amin`：存取、修改分鐘
`-ctime`：創建天數

```
find <目錄> -name '*.html'   # 只會匹配 .html檔
find <目錄> -iname '*.html'  # 也會匹配 .Html檔

find <目錄> -size +50M  # 50MB 以上

find <目錄> -mtime +7   # 超過7天沒有被存取跟修改
find <目錄> -amin -10   # 10分鐘內有被存取跟修改
```
使用邏輯運算符號
`-a`：邏輯與（AND），在 find 中是默認的操作，通常可以省略
`-o`：邏輯或（OR），將多個條件組合在一起，匹配任一條件的檔案
`!` 或 `-not`：邏輯非（NOT），排除符合條件的檔案。
```
find <目錄> -name '*.html' -o -name '*.js'
```
指定檔案類型
```
# 指定搜尋「檔案」
find <目錄> -type f -iname '*.txt'  # type "file"

# 指定搜尋「目錄」
find <目錄> -type d -iname 'dir'    # type "directory"
```

![](https://img.devrant.com/devrant/rant/r_1799945_d1D3F.jpg =40%x)

## 文字編輯 Text Editor
::: warning
*可以在**指令介面**編輯文件～*
:::
### nano
:penguin: **簡單好操作**

創建＆打開檔案
```
nano <檔名> 
```
接著整個終端機介面就會變成編輯器，可以輸入跟刪除等等～
大部分指令都是透過`ctrl^` + 其他東東，介面底下都會寫，所以不怕迷路！
- `ctrl^+k` 剪下整行
- `ctrl^+u` 貼上
- `ctrl^+shift+6` 選取範圍 
- `alt+6` 複製整行（但Mac沒有這種東東）
- `ctrl^+O` 儲存
- `ctrl^+X` 離開




### vim
:penguin: **複雜多功能、學習曲線高**
![](https://programmerhumor.io/wp-content/uploads/2022/09/programmerhumor-io-linux-memes-programming-memes-deaafa4f3611a70.png =70%x)
![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRWOkINsL4NlnBuoZyeAmioLfgRBV9s2jZE4w&s)              ![](https://cdn.stackoverflow.co/images/jo7n4k8s/production/7a0bf96c6e3155ca56c74723cb0c0767517a4429-324x318.jpg?auto=format)

#### vim 的四種主要模式
- 命令/普通模式 command/normal mode：一進入vim的預設模式，無法**直接編輯**內容（打字、刪除），主要在這裡進行模式的切換並操作一些功能
- 插入模式 insert mode：
- 視覺模式 visual mode
- 底線命令/命令行/指令模式 last line / command line mode


#### 普通模式
一進入vim的預設模式，**無法直接編輯**內容（打字、刪除），主要在這裡進行模式的切換並操作一些功能。

創建＆打開檔案
```
vim <檔名>
```
一開始進入vim會是在普通模式，如果要**切換模式**
- 進入插入模式：
    - 光標位置 : `i` (insert)
    - 光標後方 : `a` (append)
    - 光標下方 : `o` (open)
    - 取代字符 : `s` (substitute)
- 進入視覺模式：`v`
- 退回普通模式：`esc`

**常用功能*
- 有關移動
     ![](https://lh3.googleusercontent.com/-RXunPsuCdOQ/YBW94PGNgpI/AAAAAAAAC1E/7OLMrM-zSFUoVNq_OkHaZJfhgtiphs8NwCLcBGAsYHQ/s16000/007.move-hjkl.png)
    - `w` 移動到下一個單字
    - `b` 移動到前一個單字
    - `0` 移動到行首
    - `$` 移動到行尾
    - `G` 移動到頁面底端
    - `gg` 移動到頁面頂端
- 有關翻頁
    - `ctrl^+f`	往下一頁
    - `ctrl^+b`	往上一頁
- 有關複製
    - `yy` 整行複製
    - `yyp` 複製整行到下一行
    - `x` 剪下一個字母
    - `dd` 整行剪下
    - `dw` 從光標位置剪下一個單字
    - `daw` 剪下目前所指的一個單字
    ```
    He|llo World!
    
    # dw
    He World!
    
    # daw
    World!
    ```
- 有關貼上
    - `p` 從光標位置往後貼上
    - `P` 從光標位置往前貼上



#### 指令模式
![](https://lemmy.ml/pictrs/image/aaf13984-77d0-4e87-95fb-4586e6d09d60.jpeg =50%x)
- `:`
    - `:w`：儲存
    - `:q`：退出
    - `:q!`：退出不儲存
    - `:wq`：儲存並退出
    - `:w <filename>`：另存新檔
    - `:undo`, `u`：返回上一動
    - `:redo`, `ctrl^+r`：回到下一動
    - `:set nu`	顯示行數
    - `:set nonu` 關閉行數
- `/<word>`：往下搜尋字段，字段後面加上 `\c` 代表不分大小寫，`\C` 則代表大小敏感
- `?<word>`：往上搜尋字段
- `n`：找下一個字
- `N`：找前一個字

![](https://coffeeaddict.dev/static/972d9e94de8441fad98c1192e715cf05/935bc/vim_exit_meme.jpg =70%x)

#### 視覺模式
像是用滑鼠在文件上拖曳一樣，會把光標移動的範圍反白，然後就可以針對反白的部分進行操作

- `y` 複製 yank
- `d` 剪下 delete
- `p` 往後貼
- `P` 往前貼

執行了以上步驟後就會回到普通模式


#### 視窗分割

- `:new <檔名>` 開啟水平新視窗
- `:vnew <檔名>` 開啟垂直新視窗
- `ctrl^+ww` 切換視窗
- `ctrl^+wq` 關閉當前視窗 
- `:only` 只保留當前所在視窗

這樣就可以同時編輯多個檔案


:::warning
*雖然vim感覺很複雜，指令多到爆、有點難上手><*
*But市面上看起來還是有一批擁護者（？）*
:::
![](https://miro.medium.com/v2/resize:fit:583/0*Hx5C4CXhXdbieWHs.jpg)



