🐧 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)