Linux CheatSheet

整理一些常用到的Linux 指令/語法以及目錄,一邊學習一邊補充,希望可以讓自己更熟悉Linux,
也希望可以幫助到剛開始接觸Linux的人,不要太慌張,以下正文。

Linux 重要的系統目錄

路徑 說明 其他
/ Linux 檔案系統根目錄
/home 依使用者帳號建立子目錄,做為此帳號的家目錄 /home/student
/root root 帳號的家目錄
/bin 存放系統中最常用的基本使用者指令(二進位) binary
/sbin 基本的系統管理者指令 如 fdisk(權限存取)
/lib 存放基本的函式庫及核心模組(modules) library
/usr 包含系統的主要程序、圖形介面所需的檔案、自行安裝的軟體
/tmp 暫存檔 temporary/temp
/dev 存放裝置檔案,包含鍵盤滑鼠、硬碟、USB device file
/etc 存放系統的設定檔案,如使用者帳戶資訊、主機名稱等
/var 存放長度可變的檔案
/sys 目錄下用的檔案用來提供及設定硬體資訊
/proc 目錄下的檔案可取得process與系統的狀態 process
/mnt 軟碟與光碟預設掛載點的地方 mount
/opt 作為optional檔案和程式的存放目錄 optional
/lost+found 擺放系統不正常產生錯誤時遺失的片段

絕對路徑 vs 相對路徑

  • 絕對路徑,也就是從某個目錄開始寫起,直到指定目錄
    在windows 裡最常看到的會是: C:/Users/User/Desktop (桌面)
    在Linux 較常存放專案的路徑會是: /var/www/html/project

  • 相對路徑,以當前的工作目錄寫起,可指定上一層或下一層
    ../ 表示上一層,例如: ../../test1.txt
    ./ 表示當層,例如: ./test2.txt

常用組合鍵

| 組合按鍵 | 說明 | 效果 |
| —– |:—————————————— |
| ctrl + c| 中斷當前指令,因為與windows 的複製相同,很常誤按 |
| ctrl + d |送出EOF(End Of File)字元給正在執行中的指令。通常用來終止控制台的輸入|
| ctrl + m | 輸入enter |
| ctrl + s | 將螢幕的輸出畫面暫停 |
| ctrl + q | 將螢幕的輸出畫面恢復 |
| ctrl + u | 在指令列的整列刪除,可被ctrl + c取代 |
| ctrl + y | 回復前一次被刪除的項目 |
| ctrl + z | 暫停正在被執行的程式 |
| ctrl + r | 搜尋歷史紀錄 |

常用指令

  • cd
    切換至指定目錄: cd /var/www/html/

  • ls
    列出當前目錄的檔案,也可以指定目錄。
    常用參數:

    • -a 列出所有檔案,包含隱藏檔案(.開頭的檔案) –all
    • -l 以詳細資訊列出
    • -h 轉成human可閱讀的方式顯示檔案大小 –human-readable
    • -r 反向排序
    • -S 依檔案大小排序
    • -t 依修改時間排序
  • 方向鍵↑↓
    叫出指令操作紀錄中的上一筆/下一筆

  • tab按鍵
    自動補齊正在輸入的單字

  • man
    操作手冊,可察看指令的用法
    man ls

  • history [N]
    列出最近N筆的歷史指令

history -c 刪除所有紀錄
history -d 2 刪除編號2的指令紀錄
!! 執行上一個指令,相當於按方向鍵上 + enter
!wh 執行上一個wh 開頭的歷史指令
!5 執行編號5的指令
!-6 執行倒數第6個歷史指令

  • mkdir
    建立目錄

  • rmdir
    刪除空目錄,非空目錄就不會被刪除
    rmdir dir1 dir2 同時刪除兩個空目錄
    rmdir -p a/b/c 當c 被刪除,使得b變成空目錄時,同時刪除b;同理a也是

  • touch
    新增檔案

  • rm 刪除檔案或目錄
    rm test.txt 刪除當前目錄下的test.txt檔案
    rm -r dir3 遞迴刪除當前目錄下dir3目錄
    rm -rf dir4 強制刪除當前目錄下dir4內所有內容

  • cp
    複製檔案,copy
    cp file1 /home/student/file2 複製當前目錄下的file1 到 /home/student並命名為file2

  • mv
    搬移檔案或重新命名
    mv file1 ./dir3/file1 將file1 搬遷到 dir3底下
    mv file1 file2 將file1 更名為file2

  • pwd
    顯示當前目錄

  • cat
    顯示檔案內容

  • tac
    反向顯示

  • nl
    顯示行號

  • tail
    查看最後幾筆

參考

1
tail -f "檔名"

會進入追蹤模式,常用在看log的時候,需要知道執行程式會寫什麼樣的資訊。

tail -行數 檔名
則會列出最後n行的資訊

  • head
    與tail 相反,顯示前面行數

  • more / less
    分頁顯示檔案
    enter 向下翻一行
    空白鍵 向下翻一頁
    b 往回翻一頁
    :f 顯示出檔名及當前行數

  • file
    查看檔案類型

  • du
    查看檔案/目錄的磁碟用量(disk usage)

  • find-

    find [搜尋路徑][選項]字串

    • 翻硬碟搜尋檔案,速度較慢
    • 搜尋路徑可為多個目錄,以空白分隔
    • 若無指定路徑則預設是搜尋當前目錄(及子目錄)
根據 用法 說明
名稱 -name fileName 檔名若是萬用字元則需使用引號
使用者 -user 帳號 也可以用 -uid
使用者 -groupt 群組 也可以用 -gid
檔案類型 -type f f表示為檔案
檔案類型 -type d d表示為目錄
時間 -mtime 4 4天前當天被更動過
時間 -mtime +4 4天前(不含第4天)內被更動過
時間 -mtime -4 4天內被更動過
時間 -newer file1 比file1還要新的
檔案大小 -size [+/-]SIZE c:byte / k:KB / M:MB/ G:GB
檔案大小 -empty 空的檔案或目錄
搜尋深度 -maxdepth N 進入指定目錄下層目錄時,不超過N層

Unix/Linux 的 find 指令使用教學、技巧與範例整理

透過more find -type f查找檔案差異在哪

  • clear 清除螢幕
    也常使用ctrl + l 來代替,將目前畫面上的資料清除。

  • grep 搜尋

    grep [選項] 比對字串[檔案] # 預設列出字串所在整行

選項 作用
-o 只印出相符的字串
-n 印出行數
-H 印出檔名
-r 也搜尋子目錄
-i 不分大小寫
-l 列出檔案內容符合指定樣式的檔案名稱
-L 列出檔案內容不符合指定樣式的檔案名稱
-w 需全字符合
-s 不顯示錯誤資訊
-m N 只列出前N個
-A 顯示行數 找到字串的後幾行也會顯示出來
-B 顯示行數 找到字串的前幾行也會顯示出來

參考

1
grep -ir "\<word\>"

-i 不分大小寫
-r 遞迴
< > 精準搜尋 => keyword這種含有word的別的字不會顯示出來

  • wc 計算字數

    1
    wc file # 印出 行數、字數、字元數
  • tar 壓縮

1
2
# 打包:tar cvf FileName.tar DirName
# 解包: tar xvf FileName.tar

crontab 系統排程

直接sudo vi /etc/crontab,或者輸入 sudo crontab -e

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

0 0 * * * root php /var/www/html/axile_website_backend/slim-app/cli/cli.php periodicallyRemoveFiles >> /home/ideaxpress/cronjob.log 2>&1

vi 編輯器

預設編輯器為vi,也可以安裝其他編輯器,如vim nano 等。
vi test.txt 編輯teset.txt,該檔案不存在則會在儲存的時候新增檔案。
進入檔案時會是瀏覽模式,按下i 進入編輯模式(insert),或是a指向文件末端並進入編輯模式(append)。
進入編輯模式後可編輯文件,按下Esc 離開編輯模式回到瀏覽模式。

一般模式常用快捷指令(快速編輯指令)

功能 指令 描述
delete x 刪除游標所在位置的字元(as delete)
X 倒退建(as Backspace)
dw 從游標位置開始刪除,一直到下個單字(delete word)
D 從游標位置開始刪除,直到行末
dd 刪除游標所在的一整行
5dd 刪除游標開始的5行
6,9d 刪除6-9行
複製 yy 複製游標所在的一整行
3yy 複製從游標開始的3行
yw 複製目前單字(yank word)
放置(put) p 將複製或刪除的內容插入游標位置的後面
P 將複製或刪除的內容插入游標位置的前面

一般模式常用快捷指令(搜尋及其他)

功能 指令 描述
搜尋 /字串 搜尋符合字串,n 下一筆;N 前一筆
?字串 往前搜尋字串
其他 J 將目前行與下一行合併為一行(join)
D 從游標位置開始刪除,直到行末
u undo
U 恢復游標該行的所有改變
ctrl-r 重複上次動作
shift-g 跳到檔案最後一行
shift + g, shift + 4 跳到檔案最後一行的最後一個字符
gg 跳到第一行的第一個字符
0 跳到該行的第一個字符
: + X(shift + x) 輸入密碼 檔案加密
  • 檔案加密
    • : + X(shift + x)
    • 輸入密碼

瀏覽模式常用快截指令

  • 跳到指定行數
    • : + 行數
  • 查詢關鍵字,此時按下n 會跳下一筆
    • / + {keyword}
  • 儲存
    • :w
  • 返回
    • u
  • 退出vi
    • :q
    • 常合併 :wq 儲存並退出

(2022/08 補充)
這邊我歸類為偶爾會用到,需要的時候可以來查找,
不過因為每個人的工作內容不同,也許對其他人來說是很頻繁使用的指令。

  • 硬連結 (hard link)
    • 多個檔名對應到同一個檔案實體,不會增加inode 數量
    • 只能用在同一個檔案系統中,且只能用於檔案
    • 若實際檔案被刪除,仍能透過實際連結存取檔案

不能在家目錄內連結至USB中的檔案

1
ln file_name link_name

ln file1 hlink1 # 建立硬連結 hlink1

rm file1 # 刪除file1 仍可透過hlink1 存取檔案內容

rm hlink1 # 刪除硬連結 hlink1

  • 軟連結(soft link)
    • -s 表示soft link aka. symbolic link
    • 可連結目錄,且可跨檔案系統
    • 若實際檔案或目錄被刪除,則連結失效
      1
      ln -s target_name link_name

      ln -s file2 slink2 # 建立軟連結 slink2

      rm file2 # 刪除file2 後 slink2 就失效了

      rm slink1 # 刪除軟連結 slink1

linux 資料流

handle 代號 名稱 描述 預設裝置 用途
0 stdin 標準輸入 鍵盤/檔案 大多數指令可從stdin 讀取輸入,並將輸入寫到stdout
1 stdout 標準輸出 終端機螢幕 大多數指令可從stdin 讀取輸入,並將輸入寫到stdout
2 stderr 標準錯誤輸出 終端機螢幕 專供用來輸出錯誤訊息

可將 stdout 與 stderr 的資料流重新導向,分開處理

例如將 stdout 紀錄於檔案內,而stderr 顯示在螢幕

或是將stderr 導向至 /dev/null ,可丟棄錯誤訊息

資料流導出

  • > # 重導 stdout,覆蓋掉原始檔案內容
  • 2> # 重導stderr,覆蓋掉原始檔案內容
  • &> # 重導stderr & stdout,覆蓋掉原始檔案內容
  • >> # 重導stdout,”附加”在原始檔案內容之後
  • 2>> # 重導stderr,”附加”在原始檔案內容之後
  • &>> # 重導stderr & stdout,”附加”掉原始檔案內容

較常見的導出
2>&1 將stderr 先導入到stdout

範例
1
2
3
4
5
6
7
8
9
10
11
ls -l > list.txt # 將結果寫入list.txt中(檔案不存在會自動新增)

cat 1.txt 2.txt > join.txt (將兩個檔案內容合併至join.txt中)

mkdir a/b/c 2> /dev/null # 將錯誤訊息導向至 /dev/null

rm file 1 &> log.txt # 將正確及錯誤的結果都寫入log.txt

echo "Mary" >> login.txt # 在login.txt 中最後一行新增"Mary"

rm file1 &> log.txt # 將正確及錯誤的結果附加到log.txt

資料流導入

  • < file # 由file 取代鍵盤當作資料輸入的來源
    • wc < /etc/passwd
  • <<text # 讀取stdin,直到符合text字樣的行出現為止,最後還會加上EOF字元
  • wc << quit
  • >1234567890
  • >quit
  • 結果: 1 1 11

管線(pipe)

指令1 | 指令2

將指令1的標準輸出當作指令2的輸入

1
ls -la | more # 把ls 的結果分頁顯示

pipe 後面接的指令必須可以接收stdin

  • less、more、head、tail、grep、gzip 等就可以
  • ls、cp、mv 這類則不行

只能處理stdout,會忽略stderr

  • 但可以使用 2>&1 將stderr 先導入stdout

排序(sort)

  • 將檔案中的資料排序,並呈現在螢幕上(不影響原檔案)
  • 預設視為字串型態,比較字元的ASCII碼順序
選項 作用
-r 反向排序(大到小)
-n 以數值由小到大排序
-M 以月分排序,如 Aug, DEC等等的排序方法
-f 忽略大小寫
-u 排序並忽略過濾重複的資料
-t 分隔字元 指定排序時所用的欄位元分隔字元
-k 數字 以第幾個欄位來排序

範例

file1
Curry 94
Lin 74
Paul 93
Kobe 84
Jordan 100

sort file1 # 字典順序: 100 會在94 前面
sort -n file1 # 數值順序: 94會排在100 前面
sort -n -k 2 file1 # 以第2筆欄位數值排序

文字處理工具(sed)

  • sed 可進行多中文字處理,如字串搜索取代、新增刪除整行等
    • 預設只顯示修改的結果,不會變更檔案
      • 若使用 sed -i 則可以直接修改檔案內容
    • 以行為單位的新增刪除功能
      • nl /etc/passwd | sed ‘2,5d’ # 將第2~5行刪除
      • nl /etc/passwd | sed ‘2,$d’ # 將第2~最後一行刪除
      • nl /etc/passwd | sed ‘2a new line’ # 第2行的下一行加上”new line”
    • 搜尋檔案內的字串,並以新字串取代

      sed ‘s/要被取代的字串/新的字串/g’ 檔案

      • sed ‘s/root/ROOT/g’ /etc/passwd # 將root 改成ROOT
      • sed ‘s/root//g’ etc/passwd # 將root 字串以空字串代替,可以理解為將root 字串刪除