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