天天看點

Linux 各種指令技巧

1. 想檢視目前檔案夾及子檔案夾裡有沒有檔案名為“abc”的檔案

# find . -name abc

. :表示目前目錄

-name:表示要根據名稱查找

2. 想檢視目前檔案夾及子檔案夾裡有沒有”xyz”目錄

# find . -type d -name xyz

-type:表示設定類型,d表示檔案夾類型,可以替換為f(普通檔案)、l(連結檔案)

3. 想找出目前檔案夾及子檔案夾裡所有字尾是”.txt”的檔案

# find . -name “*.txt”

4. 想查找目前目錄及其子檔案夾中“roc”使用者自己的檔案有哪些

# find . -user roc

-user:用于設定所屬使用者的名稱,此處可替換為-group,即所屬使用者組的名稱

5. 想查找目前檔案夾及子檔案夾裡權限設定為755的所有檔案

# find . -perm 755

-perm:用于設定權限

6. 想查找目前檔案夾及子檔案夾裡的同時含有b字元和3字元的檔案:用到正規表達式技術

# find . -regex ‘.*b.*3′

-regex:表示使用正規表達式進行比對。請注意,此指令會和“全路徑”進行比對,也就是說前面要加.*,因為輸出結果中會有“./”符号。

7. 如果想全部輸出用find指令查找出的”*.abc”檔案的内容

# find . -type f -name “*.abc” -exec cat {} \;

-exec 表示由find找到的比對項會作為“-exec後面設定的指令”的參數

可以使用-ok代替-exec,這樣對每個比對項進行操作,都會要求使用者确認(y為是,n為否)

指令最後的{} \; 别忘了寫,其中{}代表用find查找到的結果中的每一個查找項。

8. 查找目前目錄下在5分鐘内被通路過的檔案

# find . -amin -5

通路過用amin,修改過用mmin,檔案狀态改變過用cmin

精确到分鐘的用amin,mmin,cmin,精确到天的用atime,mtime,ctime

在5分鐘之内的用-5,在5分鐘以上的用+5

9. 想查找目前目錄及子目錄下檔案大小大于10M的所有檔案

# find . -size +10000000c

-size:表示檔案大小,+表示大于某個數,-表示小于某個數。c表示機關是位元組,你可以将c換成k,M,G。

10. 上述所有的find指令都是查找目前目錄及其子目錄。如果不想深入到子目錄中,而是隻查找目前一層目錄,則可以:

# find . -maxdepth 1 -name “*.c”

===============================================================

service指令,顧名思義,就是用于管理Linux作業系統中服務的指令。

1. 聲明:這個指令不是在所有的linux發行版本中都有。主要是在redhat、fedora、mandriva和centos中。

2. 此指令位于/sbin目錄下,用file指令檢視此指令會發現它是一個腳本指令。

3. 分析腳本可知此指令的作用是去/etc/init.d目錄下尋找相應的服務,進行開啟和關閉等操作。

4. 開啟httpd伺服器:service httpd start

start可以換成restart表示重新啟動,stop表示關閉,reload表示重新載入配置。

5. 關閉mysql伺服器:service mysqld stop

6. 強烈建議大家将service指令替換為/etc/init.d/mysqld stop

==========================================================

du指令:disk usage,顧名思義,是關于目錄使用情況的。對了~ 它的作用就是計算目錄大小的。

1.

想看目前目錄下所有目錄以及子目錄的大小:

# du -h .

“.”代表目前目錄下。也可以換成一個明确的路徑

-h表示用K、M、G的人性化形式顯示

2.

隻想看目前目錄下abc目錄的大小,并不想看其他目錄以及其子目錄:

# du -ch abc | tail -n 1

此種方法需要管道技術來管道du和tail兩個指令來實作。

-c表示最後計算出所有所列目錄的大小之和

# du -sh abc

-s表示總結的意思,即隻列出一個總結的值

# du -h –max-depth=0 abc

–max-depth=n表示隻深入到第n層目錄,此處設定為0,即表示不深入到子目錄。

3.

列出abc目錄及其子目錄下所有目錄和檔案的大小:

# du -ah abc

-a表示包括目錄和檔案

4.

列出所有abc目錄中的目錄名不包括xyz字元串的目錄的大小:

# du -h –exclude=’*xyz*’

5.

想在一個螢幕下列出更多的關于abc目錄及子目錄大小的資訊:

# du -0h abc

-0(杠零)表示每列出一個目錄的資訊,不換行,而是直接輸出下一個目錄的資訊。

===========================================================

chkconfig在指令行操作時會經常用到。它可以友善地設定各個系統運作級别啟動的服務。這個可要好好掌握,用熟練之後,就可以輕輕松松的管理好你的啟動服務了。

  • 想列出系統所有的服務啟動情況:

    # chkconfig –list

  • 想列出mysqld服務設定情況:

    #chkconfig –list mysqld

  • 設定mysqld在等級3和5為開機運作服務:

    # chkconfig –level 35 mysqld on

    –level 35表示操作隻在等級3和5執行

    on表示啟動,off表示關閉

  • 設定mysqld在各等級為on:

    # chkconfig mysqld on

    “各等級”包括2、3、4、5等級

    等級0表示:表示關機

    等級1表示:單使用者模式

    等級2表示:無網絡連接配接的多使用者指令行模式

    等級3表示:有網絡連接配接的多使用者指令行模式

    等級4表示:不可用

    等級5表示:帶圖形界面的多使用者模式

    等級6表示:重新啟動

  • 如何增加一個服務:

    首先,服務腳本必須存放在/etc/ini.d/目錄下;

    其次,需要用chkconfig –add servicename來在chkconfig工具服務清單中增加此服務,此時服務會被在/etc/rc.d/rcN.d中賦予K/S入口了。

    最後,你就可以上面教的方法修改服務的預設啟動等級了。

  • 删除一個服務:

    # chkconfig –del servicename

    ==========================================================

  • uname -a 列印所有系統資訊
  • uname -s 列印核心名稱
  • uname -n 列印網絡節點主機名
  • uname -r 列印核心發信版本号
  • uname –help 獲得幫助資訊
  • 檢視系統版本号的方法還有:
  • cat /proc/version
  • cat /etc/redhat-release
  • cat /etc/issue

    =====================================================

    tr指令從标準輸入裝置讀取資料,經過字元串轉譯後,輸出到标準輸出裝置。

    cat filename |tr u n :用于在螢幕上将filename檔案中的u替換為n,而實際檔案中未作替換

    cat filename | tr -d abc 在螢幕上将filename内容中的所有出現的a或b或c字元删去,并顯示出來

    cat filename|tr [:lower:] [:upper:] 将檔案内容中的小寫全部變為大寫

    類似于[:lower:]的代替符号還有:

    [:alnum:] 表示所有的字母和數字

    [:alpha:] 表示所有的字母

    [:blank:] 表示所有空格

    [:digit:] 表示所有數字

    [:graph:] 表示所有可列印字元,但不包括空格

    [:print:] 表示所有可列印字元,包括空格

    =====================================================

    轉移到linux之後的一大痛苦就是壓縮和解壓縮,今天的主題是“壓縮和解壓工具gzip”。

    五分鐘教會你linux壓縮和解壓大法~~

    1 下載下傳了一個源碼檔案abc.tar.gz或abc.tgz(字尾tar.gz和tgz基本沒啥差別,相同的還有.taz和.tar.Z)

    # tar -xzvf abc.tar.gz 或

    # tar -xzvf abc.tgz

    注釋:

    tar.gz和tgz是經過歸檔并由gzip工具壓縮之後所得到的壓縮包。

    x選項表示解壓縮

    z表示用gzip工具進行解壓縮

    v表示在解壓縮時顯示詳細資訊

    f表示指定檔案(請注意,這個選項一定要放在各個選項的最後哦~~,也就是要和所指定的檔案名挨得最近哦)

    2 遇到一個檔案xyz.gz,想解壓縮:

    # gzip -d xyz.gz

    注釋:d選項表示解壓縮

    3 遇到一個檔案edf.tar,想解壓縮:(嚴格的講tar檔案是歸檔檔案,并未被壓縮,這裡提到的“解壓縮”隻是将tar檔案拆開而已):

    # tar -xvf edf.tar

    注釋:其實這個指令不是壓縮指令範疇,隻是在這裡提一下:)

    4 想将一個檔案夾dirabc壓縮成.tar.gz的壓縮檔案:

    # tar -czvf dirabc.tar.gz dirabc

    5 想檢視一下下載下傳的abc.tar.gz壓縮檔案裡包含哪些檔案

    # tar -ztvf abc.tar.gz

    6 用5的方法檢視到abc.tar.gz壓縮包,其中包括def/xyz.txt檔案等很多檔案,但隻想提取出xyz.txt這一個檔案

    # tar -xzvf abc.tar.gz def/xyz.txt

    7 解壓abc.tar.gz時我想保留原來被壓縮檔案的權限(常用于備份)

    # tar -xzvpf abc.tar.gz

    8 我想壓縮得最快,代價是壓縮比最高

    # gzip -1 abc.tar

    注釋:-1也可以換成–fast;-9表示壓縮比高,但速度最慢,-9也可以用–best代替。預設的是-6(數字不好記的話,可以這樣記:1表示一步到位,往往一步到位的東西追求的是快,而不是精緻程度 ^_^)

    =====================================================

    并不是所有的linux壓縮包都是.tar.gz的(請相信我^_^),你還會發現有一類檔案的字尾是.tar.bz2的(這也是真的)。此時,bunzip2指令就派上用場了。

    在開始講解之前,有一點必須要說明,bunzip2和bzip2的關系。如果你在fedora下工作,你會發現bunzip2是bzip2的一個符 号連接配接。但bunzip2和bzip2的功能卻正好相反。bzip2是用來壓縮檔案的(當然如果使用特殊函數也是可以用來解壓,用選項-d可以實作),而 bunzip2是用來解壓檔案的(相當于bzip2 -d)。類比,還有zip和unzip、gzip和gunzip、compress和uncompress。

    下面來看看它的使用:

    1 當你下載下傳了一個檔案為roc.tar.bz2時,該怎麼解壓它呢

    # tar -xjvf roc.tar.bz2

    注釋:j選項表示采用bunzip2工具。(​​yegle​​說可以省略j,即不特殊指定壓縮工具,隻用-xvf。這是也正确的^_^)

    2 我有一個檔案abc.txt,我想用bunzip2壓縮工具進行壓縮!

    #bzip2 abc.txt

    注釋:壓縮後會得到一個壓縮檔案abc.txt.bz2,同時原abc.txt會被删除。(這點很重要哦,linux考試會問到這一點)

    3 如果有一個檔案abc.txt.bz2,想解壓縮:

    #bunzip2 abc.txt.bz2

    注釋:解壓後會得到abc.txt,而原abc.txt.bz2會被删除。

    4 如果我想壓縮abc1.txt,abc2.txt,abc3.txt三個檔案,還有dir1和dir2目錄,共5個部分,一起壓縮到five.bz2中:

    #bzip five.bz2 abc1.txt abc2.txt abc3.txt dir1 dir2

    5 如果有abc1.txt.bz2和abc2.txt.bz2兩個檔案,我想用一個指令把兩個檔案分别解壓為abc1.txt和abc2.txt:

    # bunzip2 abc1.txt.bz2 abc2.txt.bz2

    6 如果有abc1.txt和abc2.txt兩個檔案,我想用一個指令把兩個檔案分别壓縮為abc1.txt.bz2和abc2.txt.bz2:

    # bzip2 abc1.txt abc2.txt

    =========================================================

    zip指令可以用來将檔案壓縮成為常用的zip格式。unzip指令則用來解壓縮zip檔案。

    1. 我想把一個檔案abc.txt和一個目錄dir1壓縮成為yasuo.zip:

    # zip -r yasuo.zip abc.txt dir1

    2.我下載下傳了一個yasuo.zip檔案,想解壓縮:

    # unzip yasuo.zip

    3.我目前目錄下有abc1.zip,abc2.zip和abc3.zip,我想一起解壓縮它們:

    # unzip abc\?.zip

    注釋:?表示一個字元,如果用*表示任意多個字元。

    4.我有一個很大的壓縮檔案large.zip,我不想解壓縮,隻想看看它裡面有什麼:

    # unzip -v large.zip

    5.我下載下傳了一個壓縮檔案large.zip,想驗證一下這個壓縮檔案是否下載下傳完全了

    # unzip -t large.zip

    6.我用-v選項發現music.zip壓縮檔案裡面有很多目錄和子目錄,并且子目錄中其實都是歌曲mp3檔案,我想把這些檔案都下載下傳到第一級目錄,而不是一層一層建目錄:

    # unzip -j music.zip

    ==============================================

通俗的講,作業控制指令是用來控制一個一個任務的。

1 我想把updatedb指令(用于重建立立整盤索引的指令)放在背景運作。因為我不想眼睜睜的看着機器建立索引,我還想編會兒程式呢:

# updatedb &

[1] 23336

注釋:在所要執行的指令後面加上空格,再加上&符号即可實作背景執行。所傳回的[1]表示這是第一個你放到背景的任務。23336是這個任務的程序号。

2 我執行updatedb時忘了加&了,這下我怎麼辦?有辦法:

按鍵盤上的ctrl-z組合鍵,可以将前台任務扔到背景!但務必注意的是,用ctrl-z的話,這個任務到了背景可是stopped的狀态。(你都無情的把它ctrl-z到背景了,它怎麼可能還會任勞任怨的繼續在背景工作呢?)

3 我學會了這招,我把很多程式都放到背景執行了。我想檢視一下:

# jobs

[1]+  Running                 updatedb &

注釋:顯示出了正在背景運作的任務的清單

4 我程式設計結束了。想把剛才的updatedb放回前台看看。

# fg %1

注釋:fg中的f就表示front,前台的意思。%1表示是在jobs指令中列出的1号任務。如果是2号任務呢,我猜你知道如何寫。

5 如果你用jobs指令發現有一個顯示[stopped]的任務(任務号是2),我想讓這個任務繼續在背景執行:

# bg %2

注釋:stopped的狀态通常出現在使用者ctrl-z之後。

6 我想讓背景的任務号是3的任務取消:

# kill %3

注釋:這樣就殺死了任務号為3的背景任務。

=================================================

今天程式設計,關于棧的一個小例子,其間我需要把”S.”替換為”S->”(替換不包括雙引号)。

其實這個不難,不過我覺得應該總結一下vi裡的替換技術了,以備以後查閱。

1

所有替換方案都要在冒号“:”狀态下書寫。

2

如果想将abc替換為xyz,那麼就這樣

:s/abc/xyz/

不過要特别注意,這個替換隻局限于光标所在目前行,而且更糟糕的是它隻替換目前行的第一個比對項。

即,如果此行内容為I write abc, I read xyz and abc. 那麼替換後的結果為I write xyz, I read xyz and abc.

3

如果想将一行裡的所有比對都進行替換,那麼就這樣:

:s/abc/xyz/g

4

如果想将一行裡所有的”S.”替換為”S->”,那麼就這樣:

:s/S\./S->/g

例如,此行S.abc and S->bcd and S.aaa and S..abc為,替換後為S->abc and S->bcd and S->aaa and S->.abc

此處因為點号“.”為特殊比對符,是以如果想比對點号,就需要用\放在點号前面,表示取消點号的特殊意義。

5

如果要擴大替換範圍,則可以用行數來限制:

如果要替換全文的S.為S->,則:

:1,$s/S\./S->/g

可以看出在s前面加上m,n則表示行的範圍,1表示第一行,$表示最後一行。當然你完全可以指定其他行數。

此處,m或n可以用特殊符号”.”或”$”代表,”.”代表目前行,”$”代表最後一行

如果是确定為全文替換,那麼可以用%來代替1,$,即:%s/S\./S->/g

6

你可能會發現如果我要比對一個http://roclinux.cn/index.php會很麻煩阿 因為//符号和/符号都會把替換搞亂。此時,你完全可以用#或者其他任何符号來替換/,如s/abc/xyz/可以替換為s#abc#xyz#,或者s!abc!xyz!都是可以的!這個是不是很神奇,如果你了解perl的話,你會發現更多非常非常靈活的技巧。呵呵

如此行内容為:http://roclinux.cn/index.php and http:/uuw/faf

使用如下替換指令(此處使用了#):

:s#http://roclinux\.cn/index\.php#http://www\.sohu\.com#

替換後為:http://www.sohu.com and http:/uuw/faf

7

如果我希望把具有日期格式(XXXX-XX-XX)的字元串兩側加上一對單引号,即2008-07-01變成’2008-07-01′,可以這樣做。

例如,原來檔案内容為:

aaa 2008-07-01 bbb

ccc 2008-07-12 aaa

使用如下替換指令:

:1,$s/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/’\1′/g

替換後為:

aaa ’2008-07-01′ bbb

ccc ’2008-07-12′ aaa

這個替換指令比較複雜,裡面有這幾個知識點:

第一個知識點:[0-9]表示0到9之間的任一個數字

第二個知識點:\{n\}表示将此符号前面的元素重複n遍,是以[0-9]\{4\}就表示一個四位數的數字

第三個知識點:如果在比對方案中用到了\(\)則表示要暫存這個比對内容,而\1就表示要替換為暫存的比對内容,你仔細看看我給出替換指令,就可以懂了,我們比對的如果是2008-07-01,那麼加了括号後就會被暫存,而在後面的\1處就會被替換過來,外面再加一對引号,就OK了!

ps:進階替換還是建議看看perl駱駝書。

======================================================

1 我想知道我機器安裝了哪些shell?

兩種方法可以檢視:

第一種:

[rocrocket@wupengchong ~]$ chsh -l

/bin/sh

/bin/bash

/sbin/nologin

/bin/zsh

第二種:

[rocrocket@wupengchong ~]$ cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/zsh

其實chsh -l也是來檢視這個檔案。

2 我想知道我目前正在使用的shell是哪個阿?

[rocrocket@wupengchong ~]$ echo $SHELL

/bin/bash

注意SHELL一定要是大寫。可以看到,我目前使用的shell是/bin/bash

3 執行了zsh之後,我檢視目前shell類型仍然是/bin/bash呢?

請注意,我們雖然執行了zsh,但是所謂“目前的shell”是一個大環境的概念,是針對一個已登入的使用者而言的。而我們執行zsh隻是啟動了一個zsh的解釋器程式而已,并沒有改變大環境。如果想改變“目前的shell”,那麼還是要使用chsh才可以。

4 我想把我的shell改成zsh!

[rocrocket@wupengchong ~]$ chsh -s /bin/zsh

Changing shell for rocrocket.

Password:

Shell changed.

[rocrocket@wupengchong ~]$

使用chsh加選項-s就可以修改登入的shell了!

你會發現你現在執行echo $SHELL後仍然輸出為/bin/bash,這是因為你需要重新開機你的shell才完全投入到zsh懷抱中去。

5 chsh -s到底是修改了哪裡?

秘密告訴你吧。chsh -s其實修改的就是/etc/passwd檔案裡和你的使用者名相對應的那一行。現在我來檢視下:

[rocrocket@wupengchong ~]$ cat /etc/passwd|grep ^rocrocket

rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh

看!你可以發現輸出内容的最後部分已經變成了/bin/zsh了!下次你重新開機的時候,linux就會讀取這一指令來啟動你的shell了!

好了,我要恢複正常工作,把shell修改會我熟悉的/bin/bash了!

[rocrocket@wupengchong ~]$ chsh -s /bin/bash

Changing shell for rocrocket.

Password:

Shell changed.

=====================================================

1 我想立即關機!

$shutdown -h now

2 我想立即重新開機

$shutdown -r now

3 我想在23:30分準時關機

$shutdown -h 23:30

4 我想在15分鐘後關機

$shutdown -h +15

5 總結一下,你可以看到,如果想讓shutdown幹活,你必須告訴shutdown指令一個時間,無論是now,還是23:30,還是+15。

6 我想來個惡作劇!

惡作劇,就是吓唬使用者。這個功能其實很實用,如果你是管理者,你完全可以利用“惡作劇”提醒所有登入的使用者,讓他們盡快退出程式,你要關機了。

來看看怎麼搞“惡作劇”:

$shutdown -k now “Server would shutdown in 15minutes\!”

看到了吧 加上-k選項就可以了 這樣shutdown指令就知道這個指令隻是一個惡作劇,不會真去關機的。shutdown會将你設定的消息字元串發給已登入的所有使用者,這樣就起到了提示的作用。試試-k吧!take it easy!

====================================================

在閱讀本文之前,我假設你已經對Linux系統下的硬碟、CD光牒的裝置指令規則有所了解,比如sda和sda1的關系,以及hda、sda、fd、cdrom等裝置。

===

1 我把U盤插到USB口上了,下一步我該如何做才能檢視U盤裡的内容?

我不能确定你的Linux系統會不會自動加載。是以,你應該先去/media目錄下檢視一下,看看是不是已經自動加載上了。如果是的話,應該在/media裡有一個目錄,名字類似于disk,你進入目錄就等于進入你的U盤了。

如果/media沒有你想要的東西,那就要自己mount了!

$mkdir /mnt/usb

$mount -t vfat /dev/sda /mnt/usb

這樣就可以了,你去/mnt/usb目錄看看,應該有你想要的了。如果mount指令不管用,那麼你可以将/dev/sda改成/dev/sdb或者/dev/sdc試試!

-t選項用于設定檔案系統類型,我假設你的U盤是fat32的。(因為大部分U盤都是這樣的)如果是其他檔案系統,你可以man mount來檢視一下,方法類似。

2 我把CD光牒放到光驅裡了,下一步咋辦?

如果系統沒有自動加載光驅的話,那麼用下面指令一般有效:

$mkdir /mnt/cdrom

$mount -t iso9660 /dev/cdrom /mnt/cdrom

3 我下載下傳了一個pes6.iso檔案,我怎麼加載iso檔案呢?

$mount -o loop pes6.iso /mnt/cdrom

使用-o選項和loop參數即可!

4 我下載下傳了10個iso檔案,從fifa2000.iso到fifa2009.iso,但是當我mount到fifa2007.iso時,就提示不讓我mount了!怎麼解決?

這個涉及到mount -o loop的原理了。你檢視一下/dev下的以loop開頭的檔案,你就會發現:

[rocrocket@wupengchong dev]$ ls /dev/loop*

/dev/loop0  /dev/loop2  /dev/loop4  /dev/loop6

/dev/loop1  /dev/loop3  /dev/loop5  /dev/loop7

這下知道了吧,原來在/dev裡隻預設了8個加載iso的地方。

解決辦法是這樣的:

可以先用modinfo指令檢視loop資訊:

[root@wupengchong ~]# modinfo loop

filename:       /lib/modules/2.6.26.5-45.fc9.i686/kernel/drivers/block/loop.ko

alias:          block-major-7-*

license:        GPL

srcversion:     7595F5D46DFDB4A2D489DDD

depends:

vermagic:       2.6.26.5-45.fc9.i686 SMP mod_unload 686 4KSTACKS

parm:           max_loop:Maximum number of loop devices (int)

parm:           max_part:Maximum number of partitions per loop device (int)

可以看出max_loop來限制最大loop的數目。而max_part用來設定每個loop的裝置所能支援的分區數目。

你還可以看到控制loop的是一個核心子產品:/lib/modules/2.6.26.5-45.fc9.i686/kernel/drivers/block/loop.ko。

我們的目标就是修改max_loop值。

$echo “options loop max_loop=20″>>/etc/modprobe.conf

然後就是要重新加載核心子產品,這樣來做:

[root@wupengchong ~]# modprobe -l|grep loop.ko

/lib/modules/2.6.26.5-45.fc9.i686/kernel/drivers/block/cryptoloop.ko

/lib/modules/2.6.26.5-45.fc9.i686/kernel/drivers/block/loop.ko

[root@wupengchong ~]# modprobe -r loop

[root@wupengchong ~]# modprobe loop

注意modprobe指令的選項-r表示remove,即删除某個子產品。

好了,就此我們重新加載了loop子產品,你現在再用ls /dev/loop*看看,是不是已經有20個loop裝置了。

5 我知道/etc/fstab檔案裡的内容是開機時加載的所有裝置,那麼mount能利用這個檔案麼?

可以利用,你直接執行mount -a就可以了,mount會乖乖的按照/etc/fstab檔案的内容來加載所有的裝置。

6 我這裡有不同的檔案系統,我用mount加載時需要注意什麼?

需要在mount時加-t來設定檔案系統類别:

如果是fat的,就要-t vfat;

如果是linux的ext系統的,就要-t ext或-t ext2或-t ext3,未來會有-t ext4;

如果是光驅,那就是-t iso9660;

如果檔案系統是ntfs,那麼你可能需要了解一下ntfs-3g這個軟體了。

7 我有一個老的三寸軟碟,如果mount?

$mount -t vfat /dev/fd0 /mnt/floppy

8 mount除了加載裝置,還可以做什麼?

mount可以用來裝載支援acl的分區。具體可查詢mount和acl。

mount可以用來設定ftp登入目錄,用–bind參數可以實作。

mount可以設定和修改已加載的檔案系統的屬性,具體可檢視mount的-o參數。

=============================================

大家在剛接觸linux的時候,都會使用man來查閱一些指令的幫助資訊。但是也都隻是使用“man 指令名稱”這樣簡單的格式。其實,man還有不少其他小技巧,在這和大家分享一下。

1 當你列出write時,它可能代表了Linux裡的使用者指令或系統調用,如果我隻是想了解write這個系統調用的作用,而對write指令的指令格式沒有興趣,那麼我該如何告訴man呢?

man指令後面可以加一個數字參數,表示具體的範圍定位:

數字“1”表示使用者指令

數字“2”表示系統調用

數字“3”表示C語言庫函數

數字“4”表示裝置或特殊檔案

數字“5”表示檔案格式和規則

數字“6”表示遊戲及其他

數字“7”表示宏、包及其他雜項

數字“8”表示系統管理者相關的指令

知道了這些,我就可以用man 2 write來檢視關于write系統調用的幫助資訊了。

再舉幾個例子,比如你man named,你觀察螢幕左上角會發現NAMED(8)的字樣,這就說明這個named是包含在“系統管理者相關的指令”之中的。

再比如man yum.conf,你會發現yum.conf(5) ,我想你現在應該知道它的寓意了。下次你可以直接man 5再加一個配置檔案,來查查這個檔案的配置方法了。

2 給大家推薦一個man的非常好的網站,http://www.linuxmanpages.com/,在這裡有非常全的Linux的man資訊,你可以分1-8來檢視相應的manual page!

3 我的這些man資訊都存在Linux系統的哪裡?

[root@wupengchong ~]# manpath

/usr/kerberos/man:/usr/local/share/man:/usr/share/man/en:/usr/share/man

用manpath指令就可以看到了,當你man的時候,man會到如上這些路徑去尋找對應的幫助資訊。如果沒有的話,那麼man會抱怨:

[root@wupengchong ~]# man rocrocket

No manual entry for rocrocket

呵呵

4 如何重建立立man的資料庫?

使用makewhatis指令就可以!

5 既然有man資料庫,我是否可以像搜尋引擎那樣搜出裡面的關鍵字?

可以。這樣做:

$man -k roc

使用man的-k選項,就可以列出所有包含roc字元串的man幫助資訊。

其實,更深一步,man -k和apropos指令作用相同。你完全可以用apropos roc來代替man -k roc。

其實apropos是一個腳本檔案,它不是ELF可執行檔案。是以你完全可以用vi /usr/bin/apropos看看它到底是如何實作都。呵呵

====================================================

今天的内容是Linux的wc指令,這個名字很好記,因為什麼,你也知道。

這個指令的功能也很好記,因為它功能很有限:

wc -c filename:顯示一個檔案的位元組數

wc -m filename:顯示一個檔案的字元數

wc -l filename:顯示一個檔案的行數

wc -L filename:顯示一個檔案中的最長行的長度

wc -w filename:顯示一個檔案的字數

[rocrocket@rocrocket programming]$ cat wc1.txt

1 2

34 5

你好

[rocrocket@rocrocket programming]$ wc -c wc1.txt

16 wc1.txt

[rocrocket@rocrocket programming]$ wc -m wc1.txt

12 wc1.txt

[rocrocket@rocrocket programming]$ wc -l wc1.txt

3 wc1.txt

[rocrocket@rocrocket programming]$ wc -L wc1.txt

4 wc1.txt

[rocrocket@rocrocket programming]$ wc -w wc1.txt

5

每行結尾的換行符也算一個字元,空格也算一個字元。

由于采用UTF-8編碼,是以一個漢字在這裡被轉換為3位元組,是以wc -c顯示的結果是16,即“第一行的4個位元組+第二行的5個位元組+第三行的7個位元組”=4+5+7=16。

而當使用-m選項時,一個漢字就作為一個字元計算,是以是4+5+3=12。

當使用-L時,是給出最長行的長度,第二行最長,有4個字元長。(顯然是不把換行符計算在内)

使用-w是計算字數,一個字是一個word,是以“34”表示一個word,一個“你好”表示一個word,是以2+2+1=5。

插孔說說tab制表符,這個符号比較特殊,當使用-L時,制表符算7個字元(這要依據一個制表符的長度而定,在我的系統中一個制表符算7個空格長度)。而當使用-w時,制表符和空格沒有兩樣,都作為字的間隔來看待。當用-c時,一個制表符也就算一個字元,因為它的确就隻是一個字元而已。

如果你直接執行wc wc1.txt,則顯示:

[rocrocket@rocrocket programming]$ wc wc1.txt

3  5 16

輸出資訊依次是:行數 字數 位元組數 檔案名稱。

======================================================

ln是一個很神奇的指令,它可以建立一個檔案的影子,也可以通過一個通道進入另一個地方。:)其實,所有的這些把戲都是通過軟連接配接和硬連接配接實作的。

我們假設你已經閱讀了“​​硬連接配接和軟連接配接的原理-《别怕Linux程式設計》之七​​”這篇文章,并且對其原理有比較透徹的認識。下面開始ln指令的情景舉例吧!

1 我想建一個source.txt檔案的硬連結,名字取做linksource.txt

[rocrocket@wupengchong test]$ cat source.txt

Hello!Source!

[rocrocket@wupengchong test]$ ll source.txt

-rw-rw-r– 1 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

[rocrocket@wupengchong test]$ ln source.txt linksource.txt

[rocrocket@wupengchong test]$ ll -i source.txt linksource.txt

1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 linksource.txt

1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

可以看到,我們建立硬連結的指令格式是“ln 目标 連結名稱”,我們用ln source.txt linksource.txt來建立了一個source.txt檔案的硬連結。之後,我們用ll -i,即ls -li指令來檢視了檔案的資訊,其中-i選項表示列出每個檔案的inode節點ID,我們可以發現source.txt和linksource.txt的inode号是完全一樣的,都是1178119,這就說明它們都指向同一個資料塊。這就是硬連結。

但要注意,硬連結不允許跨分區來建立,也就是不允許跨檔案系統來建立,即使是同一類型的檔案系統也是不行的。是以硬連結隻能在一個分區内建立。

2 我想建立一個source.txt檔案的軟連結,名字叫做softsource。

[rocrocket@wupengchong test]$ ln -s source.txt softsource

[rocrocket@wupengchong test]$ ll -i source.txt softsource

1178211 lrwxrwxrwx 1 rocrocket rocrocket 10 2008-10-23 09:32 softsource -> source.txt

1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

可以看到,建立軟連結也是使用ln指令,但是必須加上-s選項,建立軟連結的指令格式為“ln -s 目标 連結名稱”。之後我們可以使用ls指令可以檢視到軟連結softsource和source.txt的inode号是不一樣的,這說明他們完全指向兩個不同的資料庫快。而且,細心的朋友能夠觀察到軟連結檔案的權限欄首字元為l,這也是軟鍊差別于普通檔案的地方之一。

如果這個時候,我們删除了source.txt檔案,則軟連結softsource就會程式設計紅色字型,這表示警告,這是一個有問題的檔案,它無法找到它所辨別的檔案source.txt了。

3 剛才的兩個例子都是連結檔案的,那連結目錄呢,我想試試!

[rocrocket@wupengchong test]$ ln tempdir linkdir

ln: `temp’: hard link not allowed for directory

我想硬連結一個目錄tempdir,但是報錯了!是的,硬連結是不允許連結到目錄的。(待會兒來分析原因,少安毋躁)

[rocrocket@wupengchong test]$ ln -s temp linkdir

目錄的軟連結的建立是允許的,看,我建立了一個temp目錄的軟連結linkdir,以後我完全可以cd linkdir來進入temp目錄了。像這樣:

[rocrocket@wupengchong test]$ cd linkdir/

[rocrocket@wupengchong linkdir]$ ls

a001.txt  a002.c  a.out  sixunhuan.c

[rocrocket@wupengchong linkdir]$ cd ../temp/

[rocrocket@wupengchong temp]$ ls

a001.txt  a002.c  a.out  sixunhuan.c

[rocrocket@wupengchong temp]$

我們來檢視下這兩個目錄的屬性資訊:

[rocrocket@wupengchong test]$ ll|grep -E “temp|linkdir”

lrwxrwxrwx 1 rocrocket rocrocket     4 2008-10-23 09:49 linkdir -> temp

drwxr-xr-x 2 rocrocket rocrocket  4096 2008-08-07 16:08 temp

可以看到linkdir是軟連結,而temp是一個目錄。

4 為什麼ln不允許硬連結到目錄,而允許軟連結到目錄呢?

這個問題,我在網上找到了很好的解答。這位朋友解釋的很清晰。(我實在無法找到如下文章的出處以及原作者資訊,故無法辨別原作者資訊,如有知情者,可速與我聯系,我會及時加入作者資訊。謝謝)

“linux系統中的硬連接配接有兩個限制:不能跨越檔案系統和不允許普通使用者對目錄作硬連接配接。至于第一個限制,很好了解,而第二個就不那麼好了解了。 我們對任何一個目錄用ls -l 指令都可以看到其連接配接數至少是2,這也說明了系統中是存在硬連接配接的,而且指令ln -d 也可以讓超級使用者對目錄作硬連接配接,這些都說明了系統限制對目錄進行硬連接配接隻是一個硬性規定,并不是邏輯上不允許或技術上的不可行。那麼作業系統為什麼要進行限制呢?

如果引入了對目錄的硬連接配接就有可能在目錄中引入循環,那麼在目錄周遊的時候系統就會陷入無限循環當中。也許您會說,符号連接配接不也可以引入循環嗎,那麼為什麼不限制目錄的符号連接配接呢?原因就在于在linux系統中,每個檔案(目錄也是檔案)都對應着一個inode結構,其中inode資料結構中包含了檔案類型(目錄,普通檔案,符号連接配接檔案等等)的資訊,也就是說作業系統在周遊目錄時可以判斷出符号連接配接,既然可以判斷出符号連接配接當然就可以采取一些措施來防範進入過大的循環了,系統在連續遇到8個符号連接配接後就停止周遊,這就是為什麼對目錄符号連接配接不會進入死循環的原因了。但是對于硬連接配接,由于作業系統中采用的資料結構和算法限制,目前是不能防範這種死循環的。”

5 ln指令裡面有一個-n選項,它的官方解釋是這樣的:-n, –no-dereference  treat destination that is a symlink to a directory as if it were a normal file. 請問這是什麼意思阿?