## less
`less`?命令用來在控制臺中分屏顯示文本文檔。它在許多發行版中可用。
~~~
#?less?unixtoolbox.xhtml
~~~
一些重要指令(^N 代表 [control]-[N]):
-
**h H**?? ? ? 顯示指令的匯總列表
-
**f ^F ^V SPACE**?? ? ? 向前滾動一屏(或者 N 行)
-
**b ^B ESC-v**?? ? ? 向后滾動一屏(或者 N 行)
-
**F**?? ? ? 向前滾動;類似于"tail -f"
-
**/pattern**?? ? ? 向前搜索匹配該模式的行
-
**?pattern**?? ? ? 向后搜索匹配該模式的行
-
**n**?? ? ? 重復之前的搜索
-
**N**?? ? ? 反方向重復之前的搜索
-
**q**?? ? ? 退出
## vi
Vi 在任何 Linux/Unix 發行安裝版(gentoo 沒有?)上都存在。因此,我們有必要了解一些基本的命令。Vi 有兩個模式:命令模式和插入模式。使用?**[ESC]**?鍵可進入命令模式,使用?**i**?鍵可進入插入模式。如果你迷失了,可在命令模式下鍵入?`: help`。
編輯器?`nano`?和?`pico`?通常也都可用,而且更容易(IMHO)使用。
### Quit
-
**:w**?newfilename ? ? ? 保存文件為 newfilename
-
**:wq or :x**?? ? ? 保存并退出
-
**:q!**?? ? ? 退出但不保存
### 移動和查找
-
**/string**?? ? ? 向前查找 string
-
**?string**?? ? ? 向后查找 string
-
**n**?? ? ? 同方向重復上一次搜索命令
-
**N**?? ? ? 反方向重復上一次搜索命令
-
**{**?? ? ? 光標移至段落結尾
-
**}**?? ? ? 光標移至段落開頭
-
**1G**?? ? ? 光標移至文件的第一行首
-
**nG**?? ? ? 光標移至文件的第 n 行首
-
**G**?? ? ? 光標移至文件的最后一行首
-
**:%s/OLD/NEW/g**?? ? ? 替換所有查找到的 OLD 為 NEW
### 刪除文本
-
**dd**?? ? ? 刪除當前行
-
**D**?? ? ? 刪除光標到當前行末尾的字符
-
**dw**?? ? ? 刪除單詞
-
**x**?? ? ? 刪除字符
-
**u**?? ? ? 回復上一次操作
-
**U**?? ? ? 回復所有此行的更改
## mail
`mail`?命令是一個讀取和發送郵件的應用程序,她通常已安裝。要發送一封郵件,可以簡單的輸入 "mail user@domain"。其第一行為主題,然后是郵件內容。在一個新行中使用單個點(.)來結束并發送郵件。例子:
~~~
#?mail?c@cb.vu
Subject:?Your?text?is?full?of?typos
"For?a?moment,?nothing?happened.?Then,?after?a?second?or?so,?
nothing?continued?to?happen."
.
EOT
#
~~~
這同樣可用于管道:
~~~
#?echo?"This?is?the?mail?body"?|?mail?c@cb.vu
~~~
也是測試郵件服務器的簡單方法。
## tar
命令?`tar`?(磁帶存檔) 可以為文件和目錄創建檔案。歸檔文件 .tar 是未壓縮的,一個壓縮過的歸檔文件的后綴是 .tgz 或 .tar.gz (zip) 或者 .tbz (bzip2)。不要使用絕對路徑建立一個歸檔文件,你可能要解開這個歸檔文件到某個地方。一些常用命令如下:
### 創建
#?cd?/
#?tar?-cf?home.tar?home/????????#?歸檔整個?/home?目錄(c?為創建)
#?tar?-czf?home.tgz?home/???????#?等同于?zip?壓縮
#?tar?-cjf?home.tbz?home/???????#?等同于?bzip2?壓縮
從一個目錄樹中只包含一個(或2個)目錄,并保持相對目錄結構。舉個例子,/usr/local/etc 和 /usr/local/www,它們在歸檔文件中的第一層目錄是 local/。
#?tar?-C?/usr?-czf?local.tgz?local/etc?local/www
#?tar?-C?/usr?-xzf?local.tgz????#?釋放?local?目錄到?/usr
#?cd?/usr;?tar?-xzf?local.tgz???#?同上面一樣
### 釋放(Extract)
#?tar?-tzf?home.tgz?????????????#?列出歸檔文件中的所有文件,并不釋放
#?tar?-xf?home.tar??????????????#?釋放歸檔文件(x?為釋放)
#?tar?-xzf?home.tgz?????????????#?等同于?zip?壓縮
#?tar?-xjf?home.tgz?????????????#?等同于?bzip2?壓縮
#?tar?-xjf?home.tgz?home/colin/file.txt????#?釋放單個文件
### 更高級的
#?tar?c?dir/?|?gzip?|?ssh?user@remote?'dd?of=dir.tgz'?#?歸檔壓縮?dir/?目錄并存儲到遠程主機上
#?tar?cvf?-?`find?.?-print`?>?backup.tar??????????????#?歸檔當前目錄
#?tar?-cf?-?-C?/etc?.?|?tar?xpf?-?-C?/backup/etc??????#?拷貝目錄
#?tar?-cf?-?-C?/etc?.?|?ssh?user@remote?tar?xpf?-?-C?/backup/etc??????#?遠程拷貝
#?tar?-czf?home.tgz?--exclude?'*.o'?--exclude?'tmp/'?home/
## dd
程序?`dd`?(磁盤備份(disk dump) 或 destroy disk,也可看?[dd 的含義](http://roesler-ac.de/wolfram/acro/credits.htm)) 用來拷貝分區、磁盤或者其它拷貝。通常這么用:
~~~
#?dd?if=<source>?of=<target>?bs=<byte?size>?conv=<conversion>
~~~
重要的 conv 選項:
- `notrunc`?? ? ? 不截短輸出文件
- `noerror`?? ? ? 出錯時不停止處理(e.g. 壞扇區)
- `sync`?? ? ? 把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊
默認字節大小為 512 (一個扇區)。MBR 處于磁盤的第一個扇區,之后的 63 個扇區是空的。較大的字節大小可以加快拷貝速度但也需要更多的內存。
## 備份和恢復
#?dd?if=/dev/hda?of=/dev/hdc?bs=16065b????????????????#?拷貝磁盤到磁盤(相同大小)
#?dd?if=/dev/sda7?of?/home/root.img?bs=4096?conv=notrunc,noerror?#?備份?/
#?dd?if?/home/root.img?of=/dev/sda7?bs=4096?conv=notrunc,noerror?#?恢復?/
#?dd?bs=1M?if=/dev/ad4s3e?|?gzip?-c?>?ad4s3e.gz??????????????????#?壓縮備份
#?gunzip?-dc?ad4s3e.gz?|?dd?of=/dev/ad0s3e?bs=1M?????????????????#?解壓恢復
#?dd?bs=1M?if=/dev/ad4s3e?|?gzip?|?ssh?eedcoba@fry?'dd?of=ad4s3e.gz'?#?也可為遠程的
#?gunzip?-dc?ad4s3e.gz?|?ssh?eedcoba@host?'dd?of=/dev/ad0s3e?bs=1M'
#?dd?if=/dev/ad0?of=/dev/ad2?skip=1?seek=1?bs=4k?conv=noerror????#?忽略?MBR
#?如果目標(ad2)比較小,這是必須的。
### 恢復
該?`dd`?命令會讀取分區的_每一個區塊_,即所有區塊。對于有問題的區塊,最好使用?`conv=sync,noerror`?選項,dd 將會跳過壞的區塊并入 0。因此,這就是設置塊大小等于或小于磁盤塊大小的重要性。1k 大小似乎安全,用?`bs=1k`?來設置它。假如一個磁盤有壞扇區并且有個分區的數據要恢復,那么用 dd 工具創建一個鏡像文件,掛載這個鏡像文件,然后拷貝內容到新的磁盤中。如果用了?`noerror`?選項,dd 會跳過壞扇區并寫入 0,也即壞扇區中的內容會丟失。
~~~
#?dd?if=/dev/hda?of=/dev/null?bs=1m???????????????????#?檢查壞扇區
#?dd?bs=1k?if=/dev/hda1?conv=sync,noerror,notrunc?|?gzip?|?ssh?\?#?發送到遠程
root@fry?'dd?of=hda1.gz?bs=1k'
#?dd?bs=1k?if=/dev/hda1?conv=sync,noerror,notrunc?of=hda1.img????#?存儲為一個映像文件
#?mount?-o?loop?/hda1.img?/mnt????????????????????????#?掛載這個映像文件
#?rsync?-ax?/mnt/?/newdisk/???????????????????????????#?拷貝到一個新磁盤
#?dd?if=/dev/hda?of=/dev/hda??????????????????????????#?刷新磁狀態
??#?上面的命令對于刷新磁盤(refresh?disk)很有用。這絕對安全,但必須先卸載磁盤。
### 刪除
#?dd?if=/dev/zero?of=/dev/hdc?????????????????????????#?刪除全部數據
#?dd?if=/dev/urandom?of=/dev/hdc??????????????????????#?更好的刪除全部數據
#?kill?-USR1?PID??????????????????????????????????????#?查看?dd?進度(僅Linux!)
~~~
### MBR 技巧
MBR 包含了引導程序和分區表,它的大小為 512 字節。前 446 字節為引導程序,446 到 512 字節為分區表。
~~~
#?dd?if=/dev/sda?of=/mbr_sda.bak?bs=512?count=1??????????????????#?完全備份?
MBR#?dd?if=/dev/zero?of=/dev/sda?bs=512?count=1??????????????????#?刪除?MBR?和分區表
#?dd?if=/mbr_sda.bak?of=/dev/sda?bs=512?count=1??????????????????#?完全恢復MBR
#?dd?if=/mbr_sda.bak?of=/dev/sda?bs=446?count=1??????????????????#?僅回復引導程序
#?dd?if=/mbr_sda.bak?of=/dev/sda?bs=1?count=64?skip=446?seek=446?#?恢復分區表
~~~
## screen
Screen 提供了兩個主要功能:
-
在一個終端內運行多個終端會話(terminal session)。
-
一個已啟動的程序與運行它的真實終端分離的,因此可運行于后臺。真實的終端可以被關閉,還可以在稍后再重新接上(reattached)。
### 簡短實例
開啟 screen: #?screen
在 screen 會話中,我們可以開啟一個長時間運行的程序(如 top)。Detach 這個終端,之后可以從其他機器 reattach 這個相同的終端(比如通過 ssh)。 #?top
現在用?**Ctrl-a Ctrl-d**?來 detach。Reattach 終端: #?screen?-r
或更好的:
~~~
#?screen?-R?-D
~~~
現在 attach 到這里。具體意思是:先試圖恢復離線的 screen 會話。若找不到離線的 screen 會話,即建立新的 screen 會話給用戶。
### Screen 命令 (在 screen 中)
所有命令都以?**Ctrl-a**?開始。
- **Ctrl-a ?**?各功能的幫助摘要
- **Ctrl-a c**?創建一個新的 window (終端)
- **Ctrl-a Ctrl-n 和 Ctrl-a Ctrl-p**?切換到下一個或前一個 window
- **Ctrl-a Ctrl-N**?N 為 0 到 9 的數字,用來切換到相對應的 window
- **Ctrl-a "**?獲取所有正在運行的 window 的可導航的列表
- **Ctrl-a a**?清楚錯誤的 Ctrl-a
- **Ctrl-a Ctrl-d**?斷開所有會話,會話中所有任務運行于后臺
- **Ctrl-a x**?用密碼鎖柱 screen 終端
當程序內部運行終端關閉并且你登出該終端時,該 screen 會話就會被終止。
## Find
一些重要選項:
- `-x`?(BSD)?`-xdev`?(Linux) ? ? ? 留于同一文件系統 (fstab 中的 dev)
- `-exec cmd {} \;`?? ? ? 執行命令并用全路徑替換 {}
- `-iname`?? ? ? 同 -name 一樣,但不區分大小寫
- `-ls`?? ? ? 顯示關于文件的信息(同 ls -la)
- `-size n`?? ? ? n 為 +-n (k M G T P)
- `-cmin n`?? ? ? 查找系統中最后 n 分鐘改變文件狀態的文件
~~~
#?find?.?-type?f?!?-perm?-444????????#?尋找所有無法讀取的文件
#?find?.?-type?d?!?-perm?-111????????#?尋找所有無法訪問的目錄
#?find?/home/user/?-cmin?10?-print???#?尋找最后?10?分鐘創建或修改的文件
#?find?.?-name?'*.[ch]'?|?xargs?grep?-E?'expr'?#?在當前目錄及子目錄搜索?'expr'?表達式
#?find?/?-name?"*.core"?|?xargs?rm???#?尋找?core?垃圾并刪除它們(也可試試?core.*)
#?find?/?-name?"*.core"?-print?-exec?rm?{}?\;??#?另一種語法
??????#?尋找圖像文件并創建一個歸檔文件,iname?為不區分大小寫。-r?為附加
??????#?find?.?\(?-iname?"*.png"?-o?-iname?"*.jpg"?\)?-print?-exec?tar?-rf?images.tar?{}?\;??????
#?find?.?-type?f?-name?"*.txt"?!?-name?README.txt?-print??#?除?README.txt?的文件
#?find?/var/?-size?+10M?-exec?ls?-lh?{}?\;?????#?查找?>?10?MB?的文件
#?find?/var/?-size?+10M?-ls???????????#?這個更簡單
#?find?.?-size?+10M?-size?-50M?-print
#?find?/usr/ports/?-name?work?-type?d?-print?-exec?rm?-rf?{}?\;??#?清理?port
??????#?以?SUID?查找文件;這些文件很脆弱,必須保持安全。
#?find?/?-type?f?-user?root?-perm?-4000?-exec?ls?-l?{}?\;
小心 xarg 或 exec,因為當文件或目錄中包含空格時可能會返回錯誤的結果。在有疑惑時用 "-print0 | xargs -0" 代替 "| xargs"。選項 -print0 必須在 find 命令的最后。看這個不錯的[find 迷你教程](http://www.hccfl.edu/pollock/Unix/FindCmd.htm). #?find?.?-type?f?|?xargs?ls?-l???????#?不能工作于有空格的名字
#?find?.?-type?f?-print0?|?xargs?-0?ls?-l??#?可工作于有空格的名字
#?find?.?-type?f?-exec?ls?-l?'{}'?\;?#?或使用用于?-exec?的引用?'{}'
~~~
### 混雜的
#?which?command??????????????????????#?顯示命令的全路徑名
#?time?command???????????????????????#?顯示一個命令執行完成所用的時間
#?time?cat???????????????????????????#?使用?time?作為秒表,用?Ctrl-c?來停止
#?set?|?grep?$USER???????????????????#?列顯當前環境變量
#?cal?-3?????????????????????????????#?顯示三個月日歷
#?date?[-u|--utc|--universal]?[MMDDhhmm[[CC]YY][.ss]]
#?date?10022155??????????????????????#?設置日期和時間
#?whatis?grep????????????????????????#?顯示命令的簡短信息
#?whereis?java???????????????????????#?查詢命令的的路徑和標準目錄
#?setenv?varname?value???????????????#?設置環境變量,設置變量?varname?的值為?value?(csh/tcsh)
#?export?varname="value"?????????????#?設置環境變量,設置變量?varname?的值為?value??(sh/ksh/bash)
#?pwd????????????????????????????????#?顯示當前工作目錄#?mkdir?-p?/path/to/dir??????????????
#?如果存在不顯示錯誤,建立所需的上級目錄#?mkdir?-p?project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs}
#?rmdir?/path/to/dir?????????????????#?移除目錄
#?rm?-rf?/path/to/dir????????????????#?移除目錄和其內容(強制)
#?cp?-la?/dir1?/dir2?????????????????#?存檔、硬連接目錄所有文件,用來替代拷貝
#?cp?-lpR?/dir1?/dir2????????????????#?同上?(FreeBSD)
#?cp?unixtoolbox.xhtml{,.bak}????????#?拷貝文件成新擴展名的快速方法
#?mv?/dir1?/dir2?????????????????????#?修改目錄名