鸟哥的Linux私房菜(基础篇)- 第七章、Linux 文件与目录管理
最近升級(jí)日期:2009/08/26
| 在第六章我們認(rèn)識(shí)了Linux系統(tǒng)下的文件權(quán)限概念以及目錄的配置說明。在這個(gè)章節(jié)當(dāng)中,我們就直接來進(jìn)一步的操作與管理文件與目錄吧!包括在不同的目錄間變換、創(chuàng)建與刪除目錄、創(chuàng)建與刪除文件,還有尋找文件、查閱文件內(nèi)容等等,都會(huì)在這個(gè)章節(jié)作個(gè)簡(jiǎn)單的介紹啊! |
1. 目錄與路徑
1.1 相對(duì)路徑與絕對(duì)路徑
1.2 目錄的相關(guān)操作: cd, pwd, mkdir, rmdir
1.3 關(guān)於運(yùn)行檔路徑的變量: $PATH
2. 文件與目錄管理
2.1 文件與目錄的檢視: ls
2.2 復(fù)制、刪除與移動(dòng): cp, rm, mv
2.3 取得路徑的文件名稱與目錄名稱
3. 文件內(nèi)容查閱:
3.1 直接檢視文件內(nèi)容: cat, tac, nl
3.2 可翻頁檢視: more, less
3.3 數(shù)據(jù)擷取: head, tail
3.4 非純文字檔: od
3.5 修改文件時(shí)間與建置新檔: touch
4. 文件與目錄的默認(rèn)權(quán)限與隱藏權(quán)限
4.1 文件默認(rèn)權(quán)限:umask
4.2 文件隱藏屬性: chattr, lsattr
4.4 文件特殊權(quán)限:SUID, SGID,SBIT, 權(quán)限配置
4.3 觀察文件類型:file
5. 命令與文件的搜尋:
5.1 命令檔名的搜尋:which
5.2 文件檔名的搜尋:whereis,locate, find
6. 極重要!權(quán)限與命令間的關(guān)系:
7. 重點(diǎn)回顧
8. 本章習(xí)題
9. 參考數(shù)據(jù)與延伸閱讀
10. 針對(duì)本文的建議:http://phorum.vbird.org/viewtopic.php?t=23879
目錄與路徑:
由第六章Linux的文件權(quán)限與目錄配置中透過FHS了解了Linux的『樹狀目錄』概念之后,接下來就得要實(shí)際的來搞定一些基本的路徑問題了!這些目錄的問題當(dāng)中,最重要的莫過於第六章也談過的『絕對(duì)路徑』與『相對(duì)路徑』的意義啦!絕對(duì)/相對(duì)路徑的寫法并不相同,要特別注意。此外,當(dāng)你下達(dá)命令時(shí),該命令是透過什么功能來取得的?這與PATH這個(gè)變量有關(guān)呢!底下就讓我們來談?wù)劻_!
相對(duì)路徑與絕對(duì)路徑:
在開始目錄的切換之前,你必須要先了解一下所謂的『路徑(PATH)』,有趣的是:什么是『相對(duì)路徑』與『絕對(duì)路徑』?雖然前一章已經(jīng)稍微針對(duì)這個(gè)議題提過一次,不過,這里不厭其煩的再次的強(qiáng)調(diào)一下!
- 絕對(duì)路徑:路徑的寫法『一定由根目錄/ 寫起』,例如: /usr/share/doc 這個(gè)目錄。
- 相對(duì)路徑:路徑的寫法『不是由/ 寫起』,例如由 /usr/share/doc 要到 /usr/share/man 底下時(shí),可以寫成:『cd ../man』這就是相對(duì)路徑的寫法啦!相對(duì)路徑意指『相對(duì)於目前工作目錄的路徑!』
- 相對(duì)路徑的用途
那么相對(duì)路徑與絕對(duì)路徑有什么了不起呀?喝!那可真的是了不起了!假設(shè)你寫了一個(gè)軟件,這個(gè)軟件共需要三個(gè)目錄,分別是 etc, bin, man 這三個(gè)目錄,然而由於不同的人喜歡安裝在不同的目錄之下,假設(shè)甲安裝的目錄是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man ,不過乙卻喜歡安裝在 /home/packages/etc, /home/packages/bin, /home/packages/man 這三個(gè)目錄中,請(qǐng)問如果需要用到絕對(duì)路徑的話,那么是否很麻煩呢?是的!如此一來每個(gè)目錄下的東西就很難對(duì)應(yīng)的起來!這個(gè)時(shí)候相對(duì)路徑的寫法就顯的特別的重要了!
此外,如果你跟鳥哥一樣,喜歡將路徑的名字寫的很長,好讓自己知道那個(gè)目錄是在干什么的,例如:/cluster/raid/output/taiwan2006/smoke 這個(gè)目錄,而另一個(gè)目錄在 /cluster/raid/output/taiwan2006/cctm ,那么我從第一個(gè)要到第二個(gè)目錄去的話,怎么寫比較方便?當(dāng)然是『cd ../cctm 』比較方便羅!對(duì)吧!
- 絕對(duì)路徑的用途
但是對(duì)於檔名的正確性來說,『絕對(duì)路徑的正確度要比較好~』。一般來說,鳥哥會(huì)建議你,如果是在寫程序 (shell scripts) 來管理系統(tǒng)的條件下,務(wù)必使用絕對(duì)路徑的寫法。怎么說呢?因?yàn)榻^對(duì)路徑的寫法雖然比較麻煩,但是可以肯定這個(gè)寫法絕對(duì)不會(huì)有問題。如果使用相對(duì)路徑在程序當(dāng)中,則可能由於你運(yùn)行的工作環(huán)境不同,導(dǎo)致一些問題的發(fā)生。這個(gè)問題在工作排程(at, cron, 第十六章)當(dāng)中尤其重要!這個(gè)現(xiàn)象我們?cè)谑隆hell script時(shí),會(huì)再次的提醒你喔! ^_^
目錄的相關(guān)操作:
我們之前稍微提到變換目錄的命令是cd,還有哪些可以進(jìn)行目錄操作的命令呢?例如創(chuàng)建目錄啊、刪除目錄之類的~還有,得要先知道的,就是有哪些比較特殊的目錄呢?舉例來說,底下這些就是比較特殊的目錄,得要用力的記下來才行:
| . 代表此層目錄 .. 代表上一層目錄 - 代表前一個(gè)工作目錄 ~ 代表『目前使用者身份』所在的家目錄 ~account 代表 account 這個(gè)使用者的家目錄(account是個(gè)帳號(hào)名稱) |
需要特別注意的是:在所有目錄底下都會(huì)存在的兩個(gè)目錄,分別是『.』與『..』分別代表此層與上一級(jí)目錄的意思。那么來思考一下底下這個(gè)例題:
| 例題: 請(qǐng)問在Linux底下,根目錄下有沒有上一級(jí)目錄(..)存在? 答: 若使用『 ls -al / 』去查詢,可以看到根目錄下確實(shí)存在 . 與 .. 兩個(gè)目錄,再仔細(xì)的查閱,可發(fā)現(xiàn)這兩個(gè)目錄的屬性與權(quán)限完全一致,這代表根目錄的上一層(..)與根目錄自己(.)是同一個(gè)目錄。 |
底下我們就來談一談幾個(gè)常見的處理目錄的命令吧:
- cd:變換目錄
- pwd:顯示目前的目錄
- mkdir:創(chuàng)建一個(gè)新的目錄
- rmdir:刪除一個(gè)空的目錄
- cd (變換目錄)
我們知道vbird這個(gè)使用者的家目錄是/home/vbird/,而root家目錄則是/root/,假設(shè)我以root身份在 Linux系統(tǒng)中,那么簡(jiǎn)單的說明一下這幾個(gè)特殊的目錄的意義是:
| [root@www ~]# cd [相對(duì)路徑或絕對(duì)路徑] # 最重要的就是目錄的絕對(duì)路徑與相對(duì)路徑,還有一些特殊目錄的符號(hào)羅! [root@www ~]# cd ~vbird # 代表去到 vbird 這個(gè)使用者的家目錄,亦即 /home/vbird [root@www vbird]# cd ~ # 表示回到自己的家目錄,亦即是 /root 這個(gè)目錄 [root@www ~]# cd # 沒有加上任何路徑,也還是代表回到自己家目錄的意思喔! [root@www ~]# cd .. # 表示去到目前的上一級(jí)目錄,亦即是 /root 的上一級(jí)目錄的意思; [root@www /]# cd - # 表示回到剛剛的那個(gè)目錄,也就是 /root 羅~ [root@www ~]# cd /var/spool/mail # 這個(gè)就是絕對(duì)路徑的寫法!直接指定要去的完整路徑名稱! [root@www mail]# cd ../mqueue # 這個(gè)是相對(duì)路徑的寫法,我們由/var/spool/mail 去到/var/spool/mqueue 就這樣寫! |
cd是Change Directory的縮寫,這是用來變換工作目錄的命令。注意,目錄名稱與cd命令之間存在一個(gè)空格。一登陸Linux系統(tǒng)后,root會(huì)在root的家目錄!那回到上一層目錄可以用『 cd .. 』。利用相對(duì)路徑的寫法必須要確認(rèn)你目前的路徑才能正確的去到想要去的目錄。例如上表當(dāng)中最后一個(gè)例子,你必須要確認(rèn)你是在/var/spool/mail當(dāng)中,并且知道在/var/spool當(dāng)中有個(gè)mqueue的目錄才行啊~這樣才能使用cd ../mqueue去到正確的目錄說,否則就要直接輸入cd /var/spool/mqueue羅~
其實(shí),我們的提示字節(jié),亦即那個(gè) [root@www ~]# 當(dāng)中,就已經(jīng)有指出目前的目錄了,剛登陸時(shí)會(huì)到自己的家目錄,而家目錄還有一個(gè)代碼,那就是『 ~ 』符號(hào)!例如上面的例子可以發(fā)現(xiàn),使用『 cd ~ 』可以回到個(gè)人的家目錄里頭去呢!另外,針對(duì) cd 的使用方法,如果僅輸入 cd 時(shí),代表的就是『 cd ~ 』的意思喔~亦即是會(huì)回到自己的家目錄啦!而那個(gè)『 cd - 』比較難以理解,請(qǐng)自行多做幾次練習(xí),就會(huì)比較明白了。
| Tips: 還是要一再地提醒,我們的 Linux 的默認(rèn)命令列模式 (bash shell) 具有文件補(bǔ)齊功能,你要常常利用 [tab] 按鍵來達(dá)成你的目錄完整性啊!這可是個(gè)好習(xí)慣啊~可以避免你按錯(cuò)鍵盤輸入錯(cuò)字說~ ^_^ |
- pwd (顯示目前所在的目錄)
| [root@www ~]# pwd [-P] 選項(xiàng)與參數(shù): -P :顯示出確實(shí)的路徑,而非使用連結(jié) (link) 路徑。范例:單純顯示出目前的工作目錄: [root@www ~]# pwd /root <== 顯示出目錄啦~范例:顯示出實(shí)際的工作目錄,而非連結(jié)檔本身的目錄名而已 [root@www ~]# cd /var/mail <==注意,/var/mail是一個(gè)連結(jié)檔 [root@www mail]# pwd /var/mail <==列出目前的工作目錄 [root@www mail]# pwd -P /var/spool/mail <==怎么回事?有沒有加 -P 差很多~ [root@www mail]# ls -ld /var/mail lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail # 看到這里應(yīng)該知道為啥了吧?因?yàn)?/var/mail 是連結(jié)檔,連結(jié)到 /var/spool/mail # 所以,加上 pwd -P 的選項(xiàng)后,會(huì)不以連結(jié)檔的數(shù)據(jù)顯示,而是顯示正確的完整路徑啊! |
pwd是Print Working Directory的縮寫,也就是顯示目前所在目錄的命令,例如在上個(gè)表格最后的目錄是/var/mail這個(gè)目錄,但是提示字節(jié)僅顯示mail,如果你想要知道目前所在的目錄,可以輸入pwd即可。此外,由於很多的套件所使用的目錄名稱都相同,例如 /usr/local/etc還有/etc,但是通常Linux僅列出最后面那一個(gè)目錄而已,這個(gè)時(shí)候你就可以使用pwd 來知道你的所在目錄羅!免得搞錯(cuò)目錄,結(jié)果...
其實(shí)有趣的是那個(gè) -P 的選項(xiàng)啦!他可以讓我們?nèi)〉谜_的目錄名稱,而不是以連結(jié)檔的路徑來顯示的。如果你使用的是CentOS 5.x的話,剛剛好/var/mail是/var/spool/mail的連結(jié)檔,所以,透過到/var/mail下達(dá)pwd -P就能夠知道這個(gè)選項(xiàng)的意義羅~ ^_^
- mkdir (創(chuàng)建新目錄)
| [root@www ~]# mkdir [-mp] 目錄名稱 選項(xiàng)與參數(shù): -m :配置文件的權(quán)限喔!直接配置,不需要看默認(rèn)權(quán)限 (umask) 的臉色~ -p :幫助你直接將所需要的目錄(包含上一級(jí)目錄)遞回創(chuàng)建起來!范例:請(qǐng)到/tmp底下嘗試創(chuàng)建數(shù)個(gè)新目錄看看: [root@www ~]# cd /tmp [root@www tmp]# mkdir test <==創(chuàng)建一名為 test 的新目錄 [root@www tmp]# mkdir test1/test2/test3/test4 mkdir: cannot create directory `test1/test2/test3/test4': No such file or directory <== 沒辦法直接創(chuàng)建此目錄啊! [root@www tmp]# mkdir -p test1/test2/test3/test4 # 加了這個(gè) -p 的選項(xiàng),可以自行幫你創(chuàng)建多層目錄!范例:創(chuàng)建權(quán)限為rwx--x--x的目錄 [root@www tmp]# mkdir -m 711 test2 [root@www tmp]# ls -l drwxr-xr-x 3 root root 4096 Jul 18 12:50 test drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2 # 仔細(xì)看上面的權(quán)限部分,如果沒有加上 -m 來強(qiáng)制配置屬性,系統(tǒng)會(huì)使用默認(rèn)屬性。 # 那么你的默認(rèn)屬性為何?這要透過底下介紹的 umask 才能了解喔! ^_^ |
如果想要?jiǎng)?chuàng)建新的目錄的話,那么就使用mkdir (make directory)吧! 不過,在默認(rèn)的情況下,你所需要的目錄得一層一層的創(chuàng)建才行!例如:假如你要?jiǎng)?chuàng)建一個(gè)目錄為 /home/bird/testing/test1,那么首先必須要有 /home 然后 /home/bird ,再來 /home/bird/testing 都必須要存在,才可以創(chuàng)建 /home/bird/testing/test1 這個(gè)目錄!假如沒有 /home/bird/testing 時(shí),就沒有辦法創(chuàng)建 test1 的目錄羅!
不過,現(xiàn)在有個(gè)更簡(jiǎn)單有效的方法啦!那就是加上 -p 這個(gè)選項(xiàng)喔!你可以直接下達(dá):『 mkdir -p /home/bird/testing/test1 』則系統(tǒng)會(huì)自動(dòng)的幫你將 /home, /home/bird, /home/bird/testing 依序的創(chuàng)建起目錄!并且,如果該目錄本來就已經(jīng)存在時(shí),系統(tǒng)也不會(huì)顯示錯(cuò)誤信息喔!挺快樂的吧! ^_^。不過鳥哥不建議常用-p這個(gè)選項(xiàng),因?yàn)閾?dān)心如果你打錯(cuò)字,那么目錄名稱就會(huì)變的亂七八糟的!
另外,有個(gè)地方你必須要先有概念,那就是『默認(rèn)權(quán)限』的地方。我們可以利用 -m 來強(qiáng)制給予一個(gè)新的目錄相關(guān)的權(quán)限,例如上表當(dāng)中,我們給予 -m 711 來給予新的目錄 drwx--x--x 的權(quán)限。不過,如果沒有給予 -m 選項(xiàng)時(shí),那么默認(rèn)的新建目錄權(quán)限又是什么呢?這個(gè)跟umask 有關(guān),我們?cè)诒菊潞箢^會(huì)加以介紹的。
- rmdir (刪除『空』的目錄)
| [root@www ~]# rmdir [-p] 目錄名稱 選項(xiàng)與參數(shù): -p :連同上一級(jí)『空的』目錄也一起刪除范例:將於mkdir范例中創(chuàng)建的目錄(/tmp底下)刪除掉! [root@www tmp]# ls -l <==看看有多少目錄存在? drwxr-xr-x 3 root root 4096 Jul 18 12:50 test drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2 [root@www tmp]# rmdir test <==可直接刪除掉,沒問題 [root@www tmp]# rmdir test1 <==因?yàn)樯杏袃?nèi)容,所以無法刪除! rmdir: `test1': Directory not empty [root@www tmp]# rmdir -p test1/test2/test3/test4 [root@www tmp]# ls -l <==您看看,底下的輸出中test與test1不見了! drwx--x--x 2 root root 4096 Jul 18 12:54 test2 # 瞧!利用 -p 這個(gè)選項(xiàng),立刻就可以將 test1/test2/test3/test4 一次刪除~ # 不過要注意的是,這個(gè) rmdir 僅能『刪除空的目錄』喔! |
如果想要?jiǎng)h除舊有的目錄時(shí),就使用rmdir吧!例如將剛剛創(chuàng)建的test殺掉,使用『 rmdir test 』即可!請(qǐng)注意呦!目錄需要一層一層的刪除才行!而且被刪除的目錄里面必定不能存在其他的目錄或文件!這也是所謂的空的目錄(empty directory)的意思啊!那如果要將所有目錄下的東西都?xì)⒌裟?#xff1f;!這個(gè)時(shí)候就必須使用『 rm -r test 』羅!不過,還是使用 rmdir 比較不危險(xiǎn)!你也可以嘗試以 -p 的選項(xiàng)加入,來刪除上一級(jí)的目錄喔!
關(guān)於運(yùn)行檔路徑的變量: $PATH
經(jīng)過第六章FHS的說明后,我們知道查閱文件屬性的命令ls完整檔名為:/bin/ls(這是絕對(duì)路徑),那你會(huì)不會(huì)覺得很奇怪:『為什么我可以在任何地方運(yùn)行/bin/ls這個(gè)命令呢? 』為什么我在任何目錄下輸入 ls 就一定可以顯示出一些信息而不會(huì)說找不到該 /bin/ls 命令呢?這是因?yàn)榄h(huán)境變量 PATH 的幫助所致呀!
當(dāng)我們?cè)谶\(yùn)行一個(gè)命令的時(shí)候,舉例來說『ls』好了,系統(tǒng)會(huì)依照PATH的配置去每個(gè)PATH定義的目錄下搜尋檔名為ls的可運(yùn)行檔,如果在PATH定義的目錄中含有多個(gè)檔名為ls的可運(yùn)行檔,那么先搜尋到的同名命令先被運(yùn)行!
現(xiàn)在,請(qǐng)下達(dá)『echo $PATH』來看看到底有哪些目錄被定義出來了?echo有『顯示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是變量,所以會(huì)顯示出目前的 PATH !
| 范例:先用root的身份列出搜尋的路徑為何? [root@www ~]# echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin :/bin:/usr/sbin:/usr/bin:/root/bin <==這是同一行!范例:用vbird的身份列出搜尋的路徑為何? [root@www ~]# su - vbird [vbird@www ~]# echo $PATH /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/vbird/bin # 仔細(xì)看,一般用戶vbird的PATH中,并不包含任何『sbin』的目錄存在喔! |
PATH(一定是大寫)這個(gè)變量的內(nèi)容是由一堆目錄所組成的,每個(gè)目錄中間用冒號(hào)(:)來隔開,每個(gè)目錄是有『順序』之分的。仔細(xì)看一下上面的輸出,你可以發(fā)現(xiàn)到無論是root還是vbird都有/bin這個(gè)目錄在PATH變量內(nèi),所以當(dāng)然就能夠在任何地方運(yùn)行l(wèi)s來找到/bin/ls運(yùn)行檔羅!
我們用幾個(gè)范例來讓你了解一下,為什么PATH是那么重要的項(xiàng)目!
| 例題: 請(qǐng)問你能不能使用一般身份使用者下達(dá)ifconfig eth0這個(gè)命令呢? 答: 如上面的范例所示,當(dāng)你使用vbird這個(gè)帳號(hào)運(yùn)行ifconfig時(shí),會(huì)出現(xiàn)『-bash: ifconfig: command not found』的字樣,因?yàn)閕fconfig的是放置到/sbin底下,而由上表的結(jié)果中我們可以發(fā)現(xiàn)vbird的PATH并沒有配置/sbin,所以默認(rèn)無法運(yùn)行。 但是你可以使用『/sbin/ifconfig eth0』來運(yùn)行這個(gè)命令喔!因?yàn)橐话阌脩暨€是可以使用ifconfig來查詢系統(tǒng)IP的參數(shù),既然PATH沒有規(guī)范到/sbin,那么我們使用『絕對(duì)路徑』也可以運(yùn)行到該命令的! |
例題: 假設(shè)你是root,如果你將ls由/bin/ls移動(dòng)成為/root/ls(可用『mv /bin/ls /root』命令達(dá)成),然后你自己本身也在/root目錄下,請(qǐng)問(1)你能不能直接輸入ls來運(yùn)行?(2)若不能,你該如何運(yùn)行l(wèi)s這個(gè)命令?(3)若要直接輸入ls即可運(yùn)行,又該如何進(jìn)行? 答: 由於這個(gè)例題的重點(diǎn)是將某個(gè)運(yùn)行檔移動(dòng)到非正規(guī)目錄去,所以我們先要進(jìn)行底下的動(dòng)作才行:(務(wù)必使用root的身份)
(2)因?yàn)檫@個(gè)ls確實(shí)存在於/root底下,并不是被刪除了!所以我們可以透過使用絕對(duì)路徑或者是相對(duì)路徑直接指定這個(gè)運(yùn)行檔檔名,底下的兩個(gè)方法都能夠運(yùn)行l(wèi)s這個(gè)命令:
|
| 例題: 如果我有兩個(gè)ls命令在不同的目錄中,例如/usr/local/bin/ls與/bin/ls那么當(dāng)我下達(dá) ls 的時(shí)候,哪個(gè)ls會(huì)被運(yùn)行? 答: 那還用說,就找出 PATH 里面哪個(gè)目錄先被查詢,則那個(gè)目錄下的命令就會(huì)被先運(yùn)行了! |
| 例題: 為什么PATH搜尋的目錄不加入本目錄(.)?加入本目錄的搜尋不是也不錯(cuò)? 答: 如果在PATH中加入本目錄(.)后,確實(shí)我們就能夠在命令所在目錄進(jìn)行命令的運(yùn)行了。但是由於你的工作目錄并非固定(常常會(huì)使用cd來切換到不同的目錄),因此能夠運(yùn)行的命令會(huì)有變動(dòng)(因?yàn)槊總€(gè)目錄底下的可運(yùn)行檔都不相同嘛!),這對(duì)使用者來說并非好事。 另外,如果有個(gè)壞心使用者在/tmp底下做了一個(gè)命令,因?yàn)?tmp是大家都能夠?qū)懭氲沫h(huán)境,所以他當(dāng)然可以這樣做。假設(shè)該命令可能會(huì)竊取使用者的一些數(shù)據(jù),如果你使用root的身份來運(yùn)行這個(gè)命令,那不是很糟糕?如果這個(gè)命令的名稱又是經(jīng)常會(huì)被用到的ls時(shí),那『中標(biāo)』的機(jī)率就更高了! 所以,為了安全起見,不建議將『.』加入PATH的搜尋目錄中。 |
而由上面的幾個(gè)例題我們也可以知道幾件事情:
- 不同身份使用者默認(rèn)的PATH不同,默認(rèn)能夠隨意運(yùn)行的命令也不同(如root與vbird);
- PATH是可以修改的,所以一般使用者還是可以透過修改PATH來運(yùn)行某些位於/sbin或/usr/sbin下的命令來查詢;
- 使用絕對(duì)路徑或相對(duì)路徑直接指定某個(gè)命令的檔名來運(yùn)行,會(huì)比搜尋PATH來的正確;
- 命令應(yīng)該要放置到正確的目錄下,運(yùn)行才會(huì)比較方便;
- 本目錄(.)最好不要放到PATH當(dāng)中。
對(duì)於PATH更詳細(xì)的『變量』說明,我們會(huì)在第三篇的bash shell中詳細(xì)說明的!
文件與目錄管理:
談了談目錄與路徑之后,再來討論一下關(guān)於文件的一些基本管理吧!文件與目錄的管理上,不外乎『顯示屬性』、『拷貝』、『刪除文件』及『移動(dòng)文件或目錄』等等,由於文件與目錄的管理在 Linux 當(dāng)中是很重要的,尤其是每個(gè)人自己家目錄的數(shù)據(jù)也都需要注意管理!所以我們來談一談?dòng)嘘P(guān)文件與目錄的一些基礎(chǔ)管理部分吧!
文件與目錄的檢視: ls
| [root@www ~]# ls [-aAdfFhilnrRSt] 目錄名稱 [root@www ~]# ls [--color={never,auto,always}] 目錄名稱 [root@www ~]# ls [--full-time] 目錄名稱 選項(xiàng)與參數(shù): -a :全部的文件,連同隱藏檔( 開頭為 . 的文件) 一起列出來(常用) -A :全部的文件,連同隱藏檔,但不包括 . 與 .. 這兩個(gè)目錄 -d :僅列出目錄本身,而不是列出目錄內(nèi)的文件數(shù)據(jù)(常用) -f :直接列出結(jié)果,而不進(jìn)行排序 (ls 默認(rèn)會(huì)以檔名排序!) -F :根據(jù)文件、目錄等資訊,給予附加數(shù)據(jù)結(jié)構(gòu),例如:*:代表可運(yùn)行檔; /:代表目錄; =:代表 socket 文件; |:代表 FIFO 文件; -h :將文件容量以人類較易讀的方式(例如 GB, KB 等等)列出來; -i :列出 inode 號(hào)碼,inode 的意義下一章將會(huì)介紹; -l :長數(shù)據(jù)串列出,包含文件的屬性與權(quán)限等等數(shù)據(jù);(常用) -n :列出 UID 與 GID 而非使用者與群組的名稱 (UID與GID會(huì)在帳號(hào)管理提到!) -r :將排序結(jié)果反向輸出,例如:原本檔名由小到大,反向則為由大到小; -R :連同子目錄內(nèi)容一起列出來,等於該目錄下的所有文件都會(huì)顯示出來; -S :以文件容量大小排序,而不是用檔名排序; -t :依時(shí)間排序,而不是用檔名。 --color=never :不要依據(jù)文件特性給予顏色顯示; --color=always :顯示顏色 --color=auto :讓系統(tǒng)自行依據(jù)配置來判斷是否給予顏色 --full-time :以完整時(shí)間模式 (包含年、月、日、時(shí)、分) 輸出 --time={atime,ctime} :輸出 access 時(shí)間或改變權(quán)限屬性時(shí)間 (ctime) 而非內(nèi)容變更時(shí)間 (modification time) |
在Linux系統(tǒng)當(dāng)中,這個(gè) ls 命令可能是最常被運(yùn)行的吧!因?yàn)槲覀冸S時(shí)都要知道文件或者是目錄的相關(guān)資訊啊~不過,我們Linux的文件所記錄的資訊實(shí)在是太多了,ls 沒有需要全部都列出來呢~所以,當(dāng)你只有下達(dá) ls 時(shí),默認(rèn)顯示的只有:非隱藏檔的檔名、以檔名進(jìn)行排序及檔名代表的顏色顯示如此而已。舉例來說,你下達(dá)『 ls /etc 』之后,只有經(jīng)過排序的檔名以及以藍(lán)色顯示目錄及白色顯示一般文件,如此而已。
那如果我還想要加入其他的顯示資訊時(shí),可以加入上頭提到的那些有用的選項(xiàng)呢~舉例來說,我們之前一直用到的 -l 這個(gè)長串顯示數(shù)據(jù)內(nèi)容,以及將隱藏檔也一起列示出來的 -a 選項(xiàng)等等。底下則是一些常用的范例,實(shí)際試做看看:
| 范例一:將家目錄下的所有文件列出來(含屬性與隱藏檔) [root@www ~]# ls -al ~ total 156 drwxr-x--- 4 root root 4096 Sep 24 00:07 . drwxr-xr-x 23 root root 4096 Sep 22 12:09 .. -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg -rw------- 1 root root 955 Sep 24 00:08 .bash_history -rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout -rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile -rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc drwx------ 3 root root 4096 Sep 5 10:37 .gconf -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog # 這個(gè)時(shí)候你會(huì)看到以 . 為開頭的幾個(gè)文件,以及目錄檔 (.) (..) .gconf 等等, # 不過,目錄檔檔名都是以深藍(lán)色顯示,有點(diǎn)不容易看清楚就是了。范例二:承上題,不顯示顏色,但在檔名末顯示出該檔名代表的類型(type) [root@www ~]# ls -alF --color=never ~ total 156 drwxr-x--- 4 root root 4096 Sep 24 00:07 ./ drwxr-xr-x 23 root root 4096 Sep 22 12:09 ../ -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg -rw------- 1 root root 955 Sep 24 00:08 .bash_history -rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout -rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile -rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc drwx------ 3 root root 4096 Sep 5 10:37 .gconf/ -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog # 注意看到顯示結(jié)果的第一行,嘿嘿~知道為何我們會(huì)下達(dá)類似 ./command # 之類的命令了吧?因?yàn)?./ 代表的是『目前目錄下』的意思啊!至於什么是 FIFO/Socket ? # 請(qǐng)參考前一章節(jié)的介紹啊!另外,那個(gè).bashrc 時(shí)間僅寫2007,能否知道詳細(xì)時(shí)間?范例三:完整的呈現(xiàn)文件的修改時(shí)間 *(modification time) [root@www ~]# ls -al --full-time ~ total 156 drwxr-x--- 4 root root 4096 2008-09-24 00:07:00.000000 +0800 . drwxr-xr-x 23 root root 4096 2008-09-22 12:09:32.000000 +0800 .. -rw------- 1 root root 1474 2008-09-04 18:27:10.000000 +0800 anaconda-ks.cfg -rw------- 1 root root 955 2008-09-24 00:08:14.000000 +0800 .bash_history -rw-r--r-- 1 root root 24 2007-01-06 17:05:04.000000 +0800 .bash_logout -rw-r--r-- 1 root root 191 2007-01-06 17:05:04.000000 +0800 .bash_profile -rw-r--r-- 1 root root 176 2007-01-06 17:05:04.000000 +0800 .bashrc drwx------ 3 root root 4096 2008-09-05 10:37:49.000000 +0800 .gconf -rw-r--r-- 1 root root 42304 2008-09-04 18:26:57.000000 +0800 install.log -rw-r--r-- 1 root root 5661 2008-09-04 18:25:55.000000 +0800 install.log.syslog # 請(qǐng)仔細(xì)看,上面的『時(shí)間』欄位變了喔!變成較為完整的格式。 # 一般來說, ls -al 僅列出目前短格式的時(shí)間,有時(shí)不會(huì)列出年份, # 藉由 --full-time 可以查閱到比較正確的完整時(shí)間格式啊! |
其實(shí) ls 的用法還有很多,包括查閱文件所在 i-node 號(hào)碼的 ls -i 選項(xiàng),以及用來進(jìn)行文件排序的 -S 選項(xiàng),還有用來查閱不同時(shí)間的動(dòng)作的 --time=atime 等選項(xiàng)(更多時(shí)間說明請(qǐng)參考本章后面touch的說明)。而這些選項(xiàng)的存在都是因?yàn)?Linux 文件系統(tǒng)記錄了很多有用的資訊的緣故。那么 Linux 的文件系統(tǒng)中,這些與權(quán)限、屬性有關(guān)的數(shù)據(jù)放在哪里呢?放在 i-node 里面。關(guān)於這部分,我們會(huì)在下一章繼續(xù)為你作比較深入的介紹啊!
無論如何, ls 最常被使用到的功能還是那個(gè) -l 的選項(xiàng),為此,很多 distribution 在默認(rèn)的情況中,已經(jīng)將 ll (L 的小寫) 配置成為 ls -l 的意思了!其實(shí),那個(gè)功能是Bash shell 的alias功能呢~也就是說,我們直接輸入 ll 就等於是輸入 ls -l 是一樣的~關(guān)於這部分,我們會(huì)在后續(xù) bash shell時(shí)再次的強(qiáng)調(diào)滴~
復(fù)制、刪除與移動(dòng): cp, rm, mv
要復(fù)制文件,請(qǐng)使用 cp (copy) 這個(gè)命令即可~不過, cp 這個(gè)命令的用途可多了~除了單純的復(fù)制之外,還可以創(chuàng)建連結(jié)檔 (就是捷徑羅),比對(duì)兩文件的新舊而予以升級(jí),以及復(fù)制整個(gè)目錄等等的功能呢!至於移動(dòng)目錄與文件,則使用 mv (move),這個(gè)命令也可以直接拿來作更名 (rename) 的動(dòng)作喔!至於移除嗎?那就是 rm (remove)這個(gè)命令羅~底下我們就來瞧一瞧先~
- cp (復(fù)制文件或目錄)
| [root@www ~]# cp [-adfilprsu] 來源檔(source) 目標(biāo)檔(destination) [root@www ~]# cp [options] source1 source2 source3 .... directory 選項(xiàng)與參數(shù): -a :相當(dāng)於 -pdr 的意思,至於 pdr 請(qǐng)參考下列說明;(常用) -d :若來源檔為連結(jié)檔的屬性(link file),則復(fù)制連結(jié)檔屬性而非文件本身; -f :為強(qiáng)制(force)的意思,若目標(biāo)文件已經(jīng)存在且無法開啟,則移除后再嘗試一次; -i :若目標(biāo)檔(destination)已經(jīng)存在時(shí),在覆蓋時(shí)會(huì)先詢問動(dòng)作的進(jìn)行(常用) -l :進(jìn)行硬式連結(jié)(hard link)的連結(jié)檔創(chuàng)建,而非復(fù)制文件本身; -p :連同文件的屬性一起復(fù)制過去,而非使用默認(rèn)屬性(備份常用); -r :遞回持續(xù)復(fù)制,用於目錄的復(fù)制行為;(常用) -s :復(fù)制成為符號(hào)連結(jié)檔 (symbolic link),亦即『捷徑』文件; -u :若 destination 比 source 舊才升級(jí) destination ! 最后需要注意的,如果來源檔有兩個(gè)以上,則最后一個(gè)目的檔一定要是『目錄』才行! |
復(fù)制(cp)這個(gè)命令是非常重要的,不同身份者運(yùn)行這個(gè)命令會(huì)有不同的結(jié)果產(chǎn)生,尤其是那個(gè)-a, -p的選項(xiàng),對(duì)於不同身份來說,差異則非常的大!底下的練習(xí)中,有的身份為root有的身份為一般帳號(hào)(在我這里用vbird這個(gè)帳號(hào)),練習(xí)時(shí)請(qǐng)?zhí)貏e注意身份的差別喔!好!開始來做復(fù)制的練習(xí)與觀察:
| 范例一:用root身份,將家目錄下的 .bashrc 復(fù)制到 /tmp 下,并更名為 bashrc [root@www ~]# cp ~/.bashrc /tmp/bashrc [root@www ~]# cp -i ~/.bashrc /tmp/bashrc cp: overwrite `/tmp/bashrc'? n <==n不覆蓋,y為覆蓋 # 重復(fù)作兩次動(dòng)作,由於 /tmp 底下已經(jīng)存在 bashrc 了,加上 -i 選項(xiàng)后, # 則在覆蓋前會(huì)詢問使用者是否確定!可以按下 n 或者 y 來二次確認(rèn)呢!范例二:變換目錄到/tmp,并將/var/log/wtmp復(fù)制到/tmp且觀察屬性: [root@www ~]# cd /tmp [root@www tmp]# cp /var/log/wtmp . <==想要復(fù)制到目前的目錄,最后的 . 不要忘 [root@www tmp]# ls -l /var/log/wtmp wtmp -rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp -rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp # 注意上面的特殊字體,在不加任何選項(xiàng)的情況下,文件的某些屬性/權(quán)限會(huì)改變; # 這是個(gè)很重要的特性!要注意喔!還有,連文件創(chuàng)建的時(shí)間也不一樣了! # 那如果你想要將文件的所有特性都一起復(fù)制過來該怎辦?可以加上 -a 喔!如下所示:[root@www tmp]# cp -a /var/log/wtmp wtmp_2 [root@www tmp]# ls -l /var/log/wtmp wtmp_2 -rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp -rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2 # 了了吧!整個(gè)數(shù)據(jù)特性完全一模一樣ㄟ!真是不賴~這就是 -a 的特性! |
這個(gè) cp 的功能很多,由於我們常常會(huì)進(jìn)行一些數(shù)據(jù)的復(fù)制,所以也會(huì)常常用到這個(gè)命令的。一般來說,我們?nèi)绻?fù)制別人的數(shù)據(jù) (當(dāng)然,該文件你必須要有 read 的權(quán)限才行啊! ^_^) 時(shí),總是希望復(fù)制到的數(shù)據(jù)最后是我們自己的,所以,在默認(rèn)的條件中, cp 的來源檔與目的檔的權(quán)限是不同的,目的檔的擁有者通常會(huì)是命令操作者本身。舉例來說,上面的范例二中,由於我是 root 的身份,因此復(fù)制過來的文件擁有者與群組就改變成為 root 所有了!這樣說,可以明白嗎?^_^
由於具有這個(gè)特性,因此當(dāng)我們?cè)谶M(jìn)行備份的時(shí)候,某些需要特別注意的特殊權(quán)限文件,例如密碼檔 (/etc/shadow) 以及一些配置檔,就不能直接以 cp 來復(fù)制,而必須要加上 -a 或者是 -p 等等可以完整復(fù)制文件權(quán)限的選項(xiàng)才行!另外,如果你想要復(fù)制文件給其他的使用者,也必須要注意到文件的權(quán)限(包含讀、寫、運(yùn)行以及文件擁有者等等),否則,其他人還是無法針對(duì)你給予的文件進(jìn)行修訂的動(dòng)作喔!注意注意!
| 范例三:復(fù)制 /etc/ 這個(gè)目錄下的所有內(nèi)容到 /tmp 底下 [root@www tmp]# cp /etc/ /tmp cp: omitting directory `/etc' <== 如果是目錄則不能直接復(fù)制,要加上 -r 的選項(xiàng) [root@www tmp]# cp -r /etc/ /tmp # 還是要再次的強(qiáng)調(diào)喔! -r 是可以復(fù)制目錄,但是,文件與目錄的權(quán)限可能會(huì)被改變 # 所以,也可以利用『 cp -a /etc /tmp 』來下達(dá)命令喔!尤其是在備份的情況下!范例四:將范例一復(fù)制的 bashrc 創(chuàng)建一個(gè)連結(jié)檔 (symbolic link) [root@www tmp]# ls -l bashrc -rw-r--r-- 1 root root 176 Sep 24 14:02 bashrc <==先觀察一下文件情況 [root@www tmp]# cp -s bashrc bashrc_slink [root@www tmp]# cp -l bashrc bashrc_hlink [root@www tmp]# ls -l bashrc* -rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc <==與原始文件不太一樣了! -rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc_hlink lrwxrwxrwx 1 root root 6 Sep 24 14:20 bashrc_slink -> bashrc |
范例四可有趣了!使用 -l 及 -s 都會(huì)創(chuàng)建所謂的連結(jié)檔(link file),但是這兩種連結(jié)檔卻有不一樣的情況。這是怎么一回事啊?那個(gè) -l 就是所謂的實(shí)體連結(jié)(hard link),至於 -s 則是符號(hào)連結(jié)(symbolic link),簡(jiǎn)單來說,bashrc_slink 是一個(gè)『捷徑』,這個(gè)捷徑會(huì)連結(jié)到bashrc去!所以你會(huì)看到檔名右側(cè)會(huì)有個(gè)指向(->)的符號(hào)!
至於bashrc_hlink文件與bashrc的屬性與權(quán)限完全一模一樣,與尚未進(jìn)行連結(jié)前的差異則是第二欄的link數(shù)由1變成2了!鳥哥這里先不介紹實(shí)體連結(jié),因?yàn)閷?shí)體連結(jié)涉及 i-node 的相關(guān)知識(shí),我們下一章談到文件系統(tǒng)(filesystem)時(shí)再來討論這個(gè)問題。
| 范例五:若 ~/.bashrc 比 /tmp/bashrc 新才復(fù)制過來 [root@www tmp]# cp -u ~/.bashrc /tmp/bashrc # 這個(gè) -u 的特性,是在目標(biāo)文件與來源文件有差異時(shí),才會(huì)復(fù)制的。 # 所以,比較常被用於『備份』的工作當(dāng)中喔! ^_^范例六:將范例四造成的 bashrc_slink 復(fù)制成為 bashrc_slink_1 與bashrc_slink_2 [root@www tmp]# cp bashrc_slink bashrc_slink_1 [root@www tmp]# cp -d bashrc_slink bashrc_slink_2 [root@www tmp]# ls -l bashrc bashrc_slink* -rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc lrwxrwxrwx 1 root root 6 Sep 24 14:20 bashrc_slink -> bashrc -rw-r--r-- 1 root root 176 Sep 24 14:32 bashrc_slink_1 <==與原始文件相同 lrwxrwxrwx 1 root root 6 Sep 24 14:33 bashrc_slink_2 -> bashrc <==是連結(jié)檔! # 這個(gè)例子也是很有趣喔!原本復(fù)制的是連結(jié)檔,但是卻將連結(jié)檔的實(shí)際文件復(fù)制過來了 # 也就是說,如果沒有加上任何選項(xiàng)時(shí),cp復(fù)制的是原始文件,而非連結(jié)檔的屬性! # 若要復(fù)制連結(jié)檔的屬性,就得要使用 -d 的選項(xiàng)了!如 bashrc_slink_2 所示。范例七:將家目錄的 .bashrc 及 .bash_history 復(fù)制到 /tmp 底下 [root@www tmp]# cp ~/.bashrc ~/.bash_history /tmp # 可以將多個(gè)數(shù)據(jù)一次復(fù)制到同一個(gè)目錄去!最后面一定是目錄! |
例題: 你能否使用vbird的身份,完整的復(fù)制/var/log/wtmp文件到/tmp底下,并更名為vbird_wtmp呢? 答: 實(shí)際做看看的結(jié)果如下:
|
總之,由於 cp 有種種的文件屬性與權(quán)限的特性,所以,在復(fù)制時(shí),你必須要清楚的了解到:
- 是否需要完整的保留來源文件的資訊?
- 來源文件是否為連結(jié)檔 (symbolic link file)?
- 來源檔是否為特殊的文件,例如 FIFO, socket 等?
- 來源檔是否為目錄?
- rm (移除文件或目錄)
| [root@www ~]# rm [-fir] 文件或目錄 選項(xiàng)與參數(shù): -f :就是 force 的意思,忽略不存在的文件,不會(huì)出現(xiàn)警告信息; -i :互動(dòng)模式,在刪除前會(huì)詢問使用者是否動(dòng)作 -r :遞回刪除啊!最常用在目錄的刪除了!這是非常危險(xiǎn)的選項(xiàng)!!!范例一:將剛剛在 cp 的范例中創(chuàng)建的 bashrc 刪除掉! [root@www ~]# cd /tmp [root@www tmp]# rm -i bashrc rm: remove regular file `bashrc'? y # 如果加上 -i 的選項(xiàng)就會(huì)主動(dòng)詢問喔,避免你刪除到錯(cuò)誤的檔名!范例二:透過萬用字節(jié)*的幫忙,將/tmp底下開頭為bashrc的檔名通通刪除: [root@www tmp]# rm -i bashrc* # 注意那個(gè)星號(hào),代表的是 0 到無窮多個(gè)任意字節(jié)喔!很好用的東西!范例三:將 cp 范例中所創(chuàng)建的 /tmp/etc/ 這個(gè)目錄刪除掉! [root@www tmp]# rmdir /tmp/etc rmdir: etc: Directory not empty <== 刪不掉啊!因?yàn)檫@不是空的目錄! [root@www tmp]# rm -r /tmp/etc rm: descend into directory `/tmp/etc'? y ....(中間省略).... # 因?yàn)樯矸菔?root ,默認(rèn)已經(jīng)加入了 -i 的選項(xiàng),所以你要一直按 y 才會(huì)刪除! # 如果不想要繼續(xù)按 y ,可以按下『 [ctrl]-c 』來結(jié)束 rm 的工作。 # 這是一種保護(hù)的動(dòng)作,如果確定要?jiǎng)h除掉此目錄而不要詢問,可以這樣做: [root@www tmp]# \rm -r /tmp/etc # 在命令前加上反斜線,可以忽略掉 alias 的指定選項(xiàng)喔!至於 alias 我們?cè)赽ash再談!范例四:刪除一個(gè)帶有 - 開頭的文件 [root@www tmp]# touch ./-aaa- <==touch這個(gè)命令可以創(chuàng)建空文件! [root@www tmp]# ls -l -rw-r--r-- 1 root root 0 Sep 24 15:03 -aaa- <==文件大小為0,所以是空文件 [root@www tmp]# rm -aaa- Try `rm --help' for more information. <== 因?yàn)?"-" 是選項(xiàng)嘛!所以系統(tǒng)誤判了! [root@www tmp]# rm ./-aaa- |
這是移除的命令(remove),要注意的是,通常在Linux系統(tǒng)下,為了怕文件被誤殺,所以很多 distributions 都已經(jīng)默認(rèn)加入 -i 這個(gè)選項(xiàng)了!而如果要連目錄下的東西都一起殺掉的話,例如子目錄里面還有子目錄時(shí),那就要使用 -r 這個(gè)選項(xiàng)了!不過,使用『 rm -r 』這個(gè)命令之前,請(qǐng)千萬注意了,因?yàn)樵撃夸浕蛭募嚎隙ā粫?huì)被 root 殺掉!因?yàn)橄到y(tǒng)不會(huì)再次詢問你是否要砍掉呦!所以那是個(gè)超級(jí)嚴(yán)重的命令下達(dá)呦!得特別注意!不過,如果你確定該目錄不要了,那么使用 rm -r 來循環(huán)殺掉是不錯(cuò)的方式!
另外,范例四也是很有趣的例子,我們?cè)谥熬驼勥^,檔名最好不要使用 "-" 號(hào)開頭,因?yàn)?"-" 后面接的是選項(xiàng),因此,單純的使用『 rm -aaa- 』系統(tǒng)的命令就會(huì)誤判啦!那如果使用后面會(huì)談到的正規(guī)表示法時(shí),還是會(huì)出問題的!所以,只能用避過首位字節(jié)是 "-" 的方法啦!就是加上本目錄『 ./ 』即可!如果 man rm 的話,其實(shí)還有一種方法,那就是『 rm -- -aaa- 』也可以啊!- mv (移動(dòng)文件與目錄,或更名)
| [root@www ~]# mv [-fiu] source destination [root@www ~]# mv [options] source1 source2 source3 .... directory 選項(xiàng)與參數(shù): -f :force 強(qiáng)制的意思,如果目標(biāo)文件已經(jīng)存在,不會(huì)詢問而直接覆蓋; -i :若目標(biāo)文件 (destination) 已經(jīng)存在時(shí),就會(huì)詢問是否覆蓋! -u :若目標(biāo)文件已經(jīng)存在,且 source 比較新,才會(huì)升級(jí) (update)范例一:復(fù)制一文件,創(chuàng)建一目錄,將文件移動(dòng)到目錄中 [root@www ~]# cd /tmp [root@www tmp]# cp ~/.bashrc bashrc [root@www tmp]# mkdir mvtest [root@www tmp]# mv bashrc mvtest # 將某個(gè)文件移動(dòng)到某個(gè)目錄去,就是這樣做!范例二:將剛剛的目錄名稱更名為 mvtest2 [root@www tmp]# mv mvtest mvtest2 <== 這樣就更名了!簡(jiǎn)單~ # 其實(shí)在 Linux 底下還有個(gè)有趣的命令,名稱為 rename , # 該命令專職進(jìn)行多個(gè)檔名的同時(shí)更名,并非針對(duì)單一檔名變更,與mv不同。請(qǐng)man rename。范例三:再創(chuàng)建兩個(gè)文件,再全部移動(dòng)到 /tmp/mvtest2 當(dāng)中 [root@www tmp]# cp ~/.bashrc bashrc1 [root@www tmp]# cp ~/.bashrc bashrc2 [root@www tmp]# mv bashrc1 bashrc2 mvtest2 # 注意到這邊,如果有多個(gè)來源文件或目錄,則最后一個(gè)目標(biāo)檔一定是『目錄!』 # 意思是說,將所有的數(shù)據(jù)移動(dòng)到該目錄的意思! |
這是搬移 (move) 的意思!當(dāng)你要移動(dòng)文件或目錄的時(shí)后,呵呵!這個(gè)命令就很重要啦!同樣的,你也可以使用 -u ( update )來測(cè)試新舊文件,看看是否需要搬移羅!另外一個(gè)用途就是『變更檔名!』,我們可以很輕易的使用 mv 來變更一個(gè)文件的檔名呢!不過,在 Linux 才有的命令當(dāng)中,有個(gè) rename ,可以用來更改大量文件的檔名,你可以利用 man rename 來查閱一下,也是挺有趣的命令喔!
取得路徑的文件名稱與目錄名稱
我們前面介紹的完整檔名 (包含目錄名稱與文件名稱) 當(dāng)中提到,完整檔名最長可以到達(dá) 4096 個(gè)字節(jié)。那么你怎么知道那個(gè)是檔名?那個(gè)是目錄名?嘿嘿!就是利用斜線 (/) 來分辨啊!其實(shí),取得檔名或者是目錄名稱,一般的用途應(yīng)該是在寫程序的時(shí)候,用來判斷之用的啦~所以,這部分的命令可以用在第三篇內(nèi)的 shell scripts 里頭喔!底下我們簡(jiǎn)單的以幾個(gè)范例來談一談 basename 與 dirname 的用途!
| [root@www ~]# basename /etc/sysconfig/network network <== 很簡(jiǎn)單!就取得最后的檔名~ [root@www ~]# dirname /etc/sysconfig/network /etc/sysconfig <== 取得的變成目錄名了! |
文件內(nèi)容查閱:
如果我們要查閱一個(gè)文件的內(nèi)容時(shí),該如何是好呢?這里有相當(dāng)多有趣的命令可以來分享一下:最常使用的顯示文件內(nèi)容的命令可以說是 cat 與 more 及 less 了!此外,如果我們要查看一個(gè)很大型的文件 (好幾百M(fèi)B時(shí)),但是我們只需要后端的幾行字而已,那么該如何是好?呵呵!用 tail 呀,此外, tac 這個(gè)命令也可以達(dá)到!好了,說說各個(gè)命令的用途吧!
- cat? 由第一行開始顯示文件內(nèi)容
- tac? 從最后一行開始顯示,可以看出 tac 是 cat 的倒著寫!
- nl ??顯示的時(shí)候,順道輸出行號(hào)!
- more 一頁一頁的顯示文件內(nèi)容
- less 與 more 類似,但是比 more 更好的是,他可以往前翻頁!
- head 只看頭幾行
- tail 只看尾巴幾行
- od?? 以二進(jìn)位的方式讀取文件內(nèi)容!
直接檢視文件內(nèi)容
直接查閱一個(gè)文件的內(nèi)容可以使用 cat/tac/nl 這幾個(gè)命令啊!
- cat (concatenate)
| [root@www ~]# cat [-AbEnTv] 選項(xiàng)與參數(shù): -A :相當(dāng)於 -vET 的整合選項(xiàng),可列出一些特殊字符而不是空白而已; -b :列出行號(hào),僅針對(duì)非空白行做行號(hào)顯示,空白行不標(biāo)行號(hào)! -E :將結(jié)尾的斷行字節(jié) $ 顯示出來; -n :列印出行號(hào),連同空白行也會(huì)有行號(hào),與 -b 的選項(xiàng)不同; -T :將 [tab] 按鍵以 ^I 顯示出來; -v :列出一些看不出來的特殊字符范例一:檢閱 /etc/issue 這個(gè)文件的內(nèi)容 [root@www ~]# cat /etc/issue CentOS release 5.3 (Final) Kernel \r on an \m范例二:承上題,如果還要加印行號(hào)呢? [root@www ~]# cat -n /etc/issue1 CentOS release 5.3 (Final)2 Kernel \r on an \m3 # 看到了吧!可以印出行號(hào)呢!這對(duì)於大文件要找某個(gè)特定的行時(shí),有點(diǎn)用處! # 如果不想要編排空白行的行號(hào),可以使用『cat -b /etc/issue』,自己測(cè)試看看:范例三:將 /etc/xinetd.conf 的內(nèi)容完整的顯示出來(包含特殊字節(jié)) [root@www ~]# cat -A /etc/xinetd.conf #$ ....(中間省略).... $ defaults$ {$ # The next two items are intended to be a quick access place to$ ....(中間省略).... ^Ilog_type^I= SYSLOG daemon info $ ^Ilog_on_failure^I= HOST$ ^Ilog_on_success^I= PID HOST DURATION EXIT$ ....(中間省略).... includedir /etc/xinetd.d$$ # 上面的結(jié)果限於篇幅,鳥哥刪除掉很多數(shù)據(jù)了。另外,輸出的結(jié)果并不會(huì)有特殊字體, # 鳥哥上面的特殊字體是要讓您發(fā)現(xiàn)差異點(diǎn)在哪里就是了?;旧?#xff0c;在一般的環(huán)境中, # 使用 [tab] 與空白鍵的效果差不多,都是一堆空白啊!我們無法知道兩者的差別。 # 此時(shí)使用 cat -A 就能夠發(fā)現(xiàn)那些空白的地方是啥鬼東西了![tab]會(huì)以 ^I 表示, # 斷行字節(jié)則是以 $ 表示,所以你可以發(fā)現(xiàn)每一行后面都是 $ 啊!不過斷行字節(jié) # 在Windows/Linux則不太相同,Windows的斷行字節(jié)是 ^M$ 羅。 # 這部分我們會(huì)在第十章 vim 軟件的介紹時(shí),再次的說明到喔! |
嘿嘿!Linux 里面有『貓』命令?喔!不是的, cat 是 Concatenate (連續(xù))的簡(jiǎn)寫,主要的功能是將一個(gè)文件的內(nèi)容連續(xù)的印出在螢?zāi)簧厦?#xff01;例如上面的例子中,我們將 /etc/issue 印出來!如果加上 -n 或 -b 的話,則每一行前面還會(huì)加上行號(hào)呦!
鳥哥個(gè)人是比較少用 cat 啦!畢竟當(dāng)你的文件內(nèi)容的行數(shù)超過 40 行以上,嘿嘿!根本來不及在螢?zāi)簧峡吹浇Y(jié)果!所以,配合等一下要介紹的 more 或者是 less 來運(yùn)行比較好!此外,如果是一般的 DOS 文件時(shí),就需要特別留意一些奇奇怪怪的符號(hào)了,例如斷行與 [tab] 等,要顯示出來,就得加入 -A 之類的選項(xiàng)了!
- tac (反向列示)
| [root@www ~]# tac /etc/issueKernel \r on an \m CentOS release 5.3 (Final) # 嘿嘿!與剛剛上面的范例一比較,是由最后一行先顯示喔! |
tac 這個(gè)好玩了!怎么說呢?詳細(xì)的看一下, cat 與 tac ,有沒有發(fā)現(xiàn)呀!對(duì)啦! tac 剛好是將 cat 反寫過來,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最后一行連續(xù)顯示在螢?zāi)簧稀?#xff0c;而 tac 則是『由最后一行到第一行反向在螢?zāi)簧巷@示出來 』,很好玩吧!
- nl (添加行號(hào)列印)
| [root@www ~]# nl [-bnw] 文件 選項(xiàng)與參數(shù): -b :指定行號(hào)指定的方式,主要有兩種:-b a :表示不論是否為空行,也同樣列出行號(hào)(類似 cat -n);-b t :如果有空行,空的那一行不要列出行號(hào)(默認(rèn)值); -n :列出行號(hào)表示的方法,主要有三種:-n ln :行號(hào)在螢?zāi)坏淖钭蠓斤@示;-n rn :行號(hào)在自己欄位的最右方顯示,且不加 0 ;-n rz :行號(hào)在自己欄位的最右方顯示,且加 0 ; -w :行號(hào)欄位的占用的位數(shù)。范例一:用 nl 列出 /etc/issue 的內(nèi)容 [root@www ~]# nl /etc/issue1 CentOS release 5.3 (Final)2 Kernel \r on an \m# 注意看,這個(gè)文件其實(shí)有三行,第三行為空白(沒有任何字節(jié)), # 因?yàn)樗强瞻仔?#xff0c;所以 nl 不會(huì)加上行號(hào)喔!如果確定要加上行號(hào),可以這樣做:[root@www ~]# nl -b a /etc/issue1 CentOS release 5.3 (Final)2 Kernel \r on an \m3 # 呵呵!行號(hào)加上來羅~那么如果要讓行號(hào)前面自動(dòng)補(bǔ)上 0 呢?可這樣[root@www ~]# nl -b a -n rz /etc/issue 000001 CentOS release 5.3 (Final) 000002 Kernel \r on an \m 000003 # 嘿嘿!自動(dòng)在自己欄位的地方補(bǔ)上 0 了~默認(rèn)欄位是六位數(shù),如果想要改成 3 位數(shù)?[root@www ~]# nl -b a -n rz -w 3 /etc/issue 001 CentOS release 5.3 (Final) 002 Kernel \r on an \m 003 # 變成僅有 3 位數(shù)羅~ |
nl 可以將輸出的文件內(nèi)容自動(dòng)的加上行號(hào)!其默認(rèn)的結(jié)果與 cat -n 有點(diǎn)不太一樣,nl 可以將行號(hào)做比較多的顯示設(shè)計(jì),包括位數(shù)與是否自動(dòng)補(bǔ)齊 0 等等的功能呢。
可翻頁檢視
前面提到的 nl 與 cat, tac 等等,都是一次性的將數(shù)據(jù)一口氣顯示到螢?zāi)簧厦?#xff0c;那有沒有可以進(jìn)行一頁一頁翻動(dòng)的命令啊?讓我們可以一頁一頁的觀察,才不會(huì)前面的數(shù)據(jù)看不到啊~呵呵!有的!那就是 more 與 less 羅~
- more (一頁一頁翻動(dòng))
| [root@www ~]# more /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.6d ....(中間省略).... --More--(28%) <== 重點(diǎn)在這一行喔!你的光標(biāo)也會(huì)在這里等待你的命令 |
仔細(xì)的給他看到上面的范例,如果 more 后面接的文件內(nèi)容行數(shù)大於螢?zāi)惠敵龅男袛?shù)時(shí),就會(huì)出現(xiàn)類似上面的圖示。重點(diǎn)在最后一行,最后一行會(huì)顯示出目前顯示的百分比,而且還可以在最后一行輸入一些有用的命令喔!在 more 這個(gè)程序的運(yùn)行過程中,你有幾個(gè)按鍵可以按的:
- 空白鍵 (space):代表向下翻一頁;
- Enter???????? :代表向下翻『一行』;
- /字串???????? :代表在這個(gè)顯示的內(nèi)容當(dāng)中,向下搜尋『字串』這個(gè)關(guān)鍵字;
- :f??????????? :立刻顯示出檔名以及目前顯示的行數(shù);
- q???????????? :代表立刻離開 more ,不再顯示該文件內(nèi)容。
- b 或 [ctrl]-b :代表往回翻頁,不過這動(dòng)作只對(duì)文件有用,對(duì)管線無用。
要離開 more 這個(gè)命令的顯示工作,可以按下 q 就能夠離開了。而要向下翻頁,就使用空白鍵即可。比較有用的是搜尋字串的功能,舉例來說,我們使用『 more /etc/man.config 』來觀察該文件,若想要在該文件內(nèi)搜尋 MANPATH 這個(gè)字串時(shí),可以這樣做:
| [root@www ~]# more /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.6d ....(中間省略).... /MANPATH <== 輸入了 / 之后,光標(biāo)就會(huì)自動(dòng)跑到最底下一行等待輸入! |
如同上面的說明,輸入了 / 之后,光標(biāo)就會(huì)跑到最底下一行,并且等待你的輸入,你輸入了字串并按下[enter]之后,嘿嘿! more 就會(huì)開始向下搜尋該字串羅~而重復(fù)搜尋同一個(gè)字串,可以直接按下 n 即可啊!最后,不想要看了,就按下 q 即可離開 more 啦!
- less (一頁一頁翻動(dòng))
| [root@www ~]# less /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.6d ....(中間省略).... : <== 這里可以等待你輸入命令! |
less 的用法比起 more 又更加的有彈性,怎么說呢?在 more 的時(shí)候,我們并沒有辦法向前面翻,只能往后面看,但若使用了 less 時(shí),呵呵!就可以使用 [pageup] [pagedown] 等按鍵的功能來往前往后翻看文件,你瞧,是不是更容易使用來觀看一個(gè)文件的內(nèi)容了呢!
除此之外,在 less 里頭可以擁有更多的『搜尋』功能喔!不止可以向下搜尋,也可以向上搜尋~實(shí)在是很不錯(cuò)用~基本上,可以輸入的命令有:
- 空白鍵????:向下翻動(dòng)一頁;
- [pagedown]:向下翻動(dòng)一頁;
- [pageup]??:向上翻動(dòng)一頁;
- /字串?????:向下搜尋『字串』的功能;
- ?字串?????:向上搜尋『字串』的功能;
- n???????? :重復(fù)前一個(gè)搜尋 (與 / 或 ? 有關(guān)!)
- N???????? :反向的重復(fù)前一個(gè)搜尋 (與 / 或 ? 有關(guān)!)
- q???????? :離開 less 這個(gè)程序;
查閱文件內(nèi)容還可以進(jìn)行搜尋的動(dòng)作~瞧~ less 是否很不錯(cuò)用啊!其實(shí) less 還有很多的功能喔!詳細(xì)的使用方式請(qǐng)使用 man less 查詢一下啊! ^_^
你是否會(huì)覺得 less 使用的畫面與環(huán)境與 man page非常的類似呢?沒錯(cuò)啦!因?yàn)閙an這個(gè)命令就是呼叫 less 來顯示說明文件的內(nèi)容的!現(xiàn)在你是否覺得 less 很重要呢? ^_^
數(shù)據(jù)擷取
我們可以將輸出的數(shù)據(jù)作一個(gè)最簡(jiǎn)單的擷取,那就是取出前面 (head) 與取出后面 (tail) 文字的功能。不過,要注意的是, head 與 tail 都是以『行』為單位來進(jìn)行數(shù)據(jù)擷取的喔!
- head (取出前面幾行)
| [root@www ~]# head [-n number] 文件 選項(xiàng)與參數(shù): -n :后面接數(shù)字,代表顯示幾行的意思[root@www ~]# head /etc/man.config # 默認(rèn)的情況中,顯示前面十行!若要顯示前 20 行,就得要這樣: [root@www ~]# head -n 20 /etc/man.config范例:如果后面100行的數(shù)據(jù)都不列印,只列印/etc/man.config的前面幾行,該如何是好? [root@www ~]# head -n -100 /etc/man.config |
head 的英文意思就是『頭』啦,那么這個(gè)東西的用法自然就是顯示出一個(gè)文件的前幾行羅!沒錯(cuò)!就是這樣!若沒有加上 -n 這個(gè)選項(xiàng)時(shí),默認(rèn)只顯示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
另外那個(gè) -n 選項(xiàng)后面的參數(shù)較有趣,如果接的是負(fù)數(shù),例如上面范例的-n -100時(shí),代表列前的所有行數(shù),但不包括后面100行。舉例來說,/etc/man.config共有141行,則上述的命令『head -n -100 /etc/man.config』就會(huì)列出前面41行,后面100行不會(huì)列印出來了。這樣說,比較容易懂了吧? ^_^
- tail (取出后面幾行)
| [root@www ~]# tail [-n number] 文件 選項(xiàng)與參數(shù): -n :后面接數(shù)字,代表顯示幾行的意思 -f :表示持續(xù)偵測(cè)后面所接的檔名,要等到按下[ctrl]-c才會(huì)結(jié)束tail的偵測(cè)[root@www ~]# tail /etc/man.config # 默認(rèn)的情況中,顯示最后的十行!若要顯示最后的 20 行,就得要這樣: [root@www ~]# tail -n 20 /etc/man.config范例一:如果不知道/etc/man.config有幾行,卻只想列出100行以后的數(shù)據(jù)時(shí)? [root@www ~]# tail -n +100 /etc/man.config范例二:持續(xù)偵測(cè)/var/log/messages的內(nèi)容 [root@www ~]# tail -f /var/log/messages<==要等到輸入[crtl]-c之后才會(huì)離開tail這個(gè)命令的偵測(cè)! |
有 head 自然就有 tail ( 尾巴 ) 羅!沒錯(cuò)!這個(gè) tail 的用法跟 head 的用法差不多類似,只是顯示的是后面幾行就是了!默認(rèn)也是顯示十行,若要顯示非十行,就加 -n number 的選項(xiàng)即可。
范例一的內(nèi)容就有趣啦!其實(shí)與head -n -xx有異曲同工之妙。當(dāng)下達(dá)『tail -n +100 /etc/man.config』代表該文件從100行以后都會(huì)被列出來,同樣的,在man.config共有141行,因此第100~141行就會(huì)被列出來啦!前面的99行都不會(huì)被顯示出來喔!
至於范例二中,由於/var/log/messages隨時(shí)會(huì)有數(shù)據(jù)寫入,你想要讓該文件有數(shù)據(jù)寫入時(shí)就立刻顯示到螢?zāi)簧?#xff0c;就利用 -f 這個(gè)選項(xiàng),他可以一直偵測(cè)/var/log/messages這個(gè)文件,新加入的數(shù)據(jù)都會(huì)被顯示到螢?zāi)簧?。直到你按下[crtl]-c才會(huì)離開tail的偵測(cè)喔!
| 例題: 假如我想要顯示 /etc/man.config 的第 11 到第 20 行呢? 答: 這個(gè)應(yīng)該不算難,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以結(jié)果就是:『 head -n 20 /etc/man.config | tail -n 10 』,這樣就可以得到第 11 到第 20 行之間的內(nèi)容了!但是里面涉及到管線命令,需要在第三篇的時(shí)候才講的到! |
非純文字檔: od
我們上面提到的,都是在查閱純文字檔的內(nèi)容。那么萬一我們想要查閱非文字檔,舉例來說,例如 /usr/bin/passwd 這個(gè)運(yùn)行檔的內(nèi)容時(shí),又該如何去讀出資訊呢?事實(shí)上,由於運(yùn)行檔通常是 binary file ,使用上頭提到的命令來讀取他的內(nèi)容時(shí),確實(shí)會(huì)產(chǎn)生類似亂碼的數(shù)據(jù)啊!那怎么辦?沒關(guān)系,我們可以利用 od 這個(gè)命令來讀取喔!
| [root@www ~]# od [-t TYPE] 文件 選項(xiàng)或參數(shù): -t :后面可以接各種『類型 (TYPE)』的輸出,例如:a :利用默認(rèn)的字節(jié)來輸出;c :使用 ASCII 字節(jié)來輸出d[size] :利用十進(jìn)位(decimal)來輸出數(shù)據(jù),每個(gè)整數(shù)占用 size bytes ;f[size] :利用浮點(diǎn)數(shù)值(floating)來輸出數(shù)據(jù),每個(gè)數(shù)占用 size bytes ;o[size] :利用八進(jìn)位(octal)來輸出數(shù)據(jù),每個(gè)整數(shù)占用 size bytes ;x[size] :利用十六進(jìn)位(hexadecimal)來輸出數(shù)據(jù),每個(gè)整數(shù)占用 size bytes ;范例一:請(qǐng)將/usr/bin/passwd的內(nèi)容使用ASCII方式來展現(xiàn)! [root@www ~]# od -t c /usr/bin/passwd 0000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000020 002 \0 003 \0 001 \0 \0 \0 260 225 004 \b 4 \0 \0 \0 0000040 020 E \0 \0 \0 \0 \0 \0 4 \0 \0 \a \0 ( \0 0000060 035 \0 034 \0 006 \0 \0 \0 4 \0 \0 \0 4 200 004 \b 0000100 4 200 004 \b 340 \0 \0 \0 340 \0 \0 \0 005 \0 \0 \0 .....(后面省略).... # 最左邊第一欄是以 8 進(jìn)位來表示bytes數(shù)。以上面范例來說,第二欄0000020代表開頭是 # 第 16 個(gè) byes (2x8) 的內(nèi)容之意。范例二:請(qǐng)將/etc/issue這個(gè)文件的內(nèi)容以8進(jìn)位列出儲(chǔ)存值與ASCII的對(duì)照表 [root@www ~]# od -t oCc /etc/issue 0000000 103 145 156 164 117 123 040 162 145 154 145 141 163 145 040 065C e n t O S r e l e a s e 5 0000020 056 062 040 050 106 151 156 141 154 051 012 113 145 162 156 145. 2 ( F i n a l ) \n K e r n e 0000040 154 040 134 162 040 157 156 040 141 156 040 134 155 012 012l \ r o n a n \ m \n \n 0000057 # 如上所示,可以發(fā)現(xiàn)每個(gè)字節(jié)可以對(duì)應(yīng)到的數(shù)值為何! # 例如e對(duì)應(yīng)的記錄數(shù)值為145,轉(zhuǎn)成十進(jìn)位:1x8^2+4x8+5=101。 |
利用這個(gè)命令,可以將 data file 或者是 binary file 的內(nèi)容數(shù)據(jù)給他讀出來喔!雖然讀出的來數(shù)值默認(rèn)是使用非文字檔,亦即是 16 進(jìn)位的數(shù)值來顯示的,不過,我們還是可以透過 -t c 的選項(xiàng)與參數(shù)來將數(shù)據(jù)內(nèi)的字節(jié)以 ASCII 類型的字節(jié)來顯示,雖然對(duì)於一般使用者來說,這個(gè)命令的用處可能不大,但是對(duì)於工程師來說,這個(gè)命令可以將 binary file 的內(nèi)容作一個(gè)大致的輸出,他們可以看得出東西的啦~ ^_^
如果對(duì)純文字檔使用這個(gè)命令,你甚至可以發(fā)現(xiàn)到 ASCII 與字節(jié)的對(duì)照表!非常有趣!例如上述的范例二,你可以發(fā)現(xiàn)到每個(gè)英文字 e 對(duì)照到的數(shù)字都是 145,轉(zhuǎn)成十進(jìn)位你就能夠發(fā)現(xiàn)那是 101 羅!如果你有任何程序語言的書,拿出來對(duì)照一下 ASCII 的對(duì)照表,就能夠發(fā)現(xiàn)真是正確啊!呵呵!
修改文件時(shí)間或建置新檔: touch
我們?cè)? ls 這個(gè)命令的介紹時(shí),有稍微提到每個(gè)文件在linux底下都會(huì)記錄許多的時(shí)間參數(shù),其實(shí)是有三個(gè)主要的變動(dòng)時(shí)間,那么三個(gè)時(shí)間的意義是什么呢?
- modification time (mtime):
當(dāng)該文件的『內(nèi)容數(shù)據(jù)』變更時(shí),就會(huì)升級(jí)這個(gè)時(shí)間!內(nèi)容數(shù)據(jù)指的是文件的內(nèi)容,而不是文件的屬性或權(quán)限喔!
- status time (ctime):
當(dāng)該文件的『狀態(tài) (status)』改變時(shí),就會(huì)升級(jí)這個(gè)時(shí)間,舉例來說,像是權(quán)限與屬性被更改了,都會(huì)升級(jí)這個(gè)時(shí)間啊。
- access time (atime):
當(dāng)『該文件的內(nèi)容被取用』時(shí),就會(huì)升級(jí)這個(gè)讀取時(shí)間 (access)。舉例來說,我們使用 cat 去讀取 /etc/man.config ,就會(huì)升級(jí)該文件的 atime 了。
這是個(gè)挺有趣的現(xiàn)象,舉例來說,我們來看一看你自己的 /etc/man.config 這個(gè)文件的時(shí)間吧!
| [root@www ~]# ls -l /etc/man.config -rw-r--r-- 1 root root 4617 Jan 6 2007 /etc/man.config [root@www ~]# ls -l --time=atime /etc/man.config -rw-r--r-- 1 root root 4617 Sep 25 17:54 /etc/man.config [root@www ~]# ls -l --time=ctime /etc/man.config -rw-r--r-- 1 root root 4617 Sep 4 18:03 /etc/man.config |
看到了嗎?在默認(rèn)的情況下,ls 顯示出來的是該文件的mtime ,也就是這個(gè)文件的內(nèi)容上次被更動(dòng)的時(shí)間。至於鳥哥的系統(tǒng)是在 9 月 4 號(hào)的時(shí)候安裝的,因此,這個(gè)文件被產(chǎn)生導(dǎo)致狀態(tài)被更動(dòng)的時(shí)間就回溯到那個(gè)時(shí)間點(diǎn)了(ctime)!而還記得剛剛我們使用的范例當(dāng)中,有使用到man.config這個(gè)文件啊,所以啊,他的 atime 就會(huì)變成剛剛使用的時(shí)間了!
文件的時(shí)間是很重要的,因?yàn)?#xff0c;如果文件的時(shí)間誤判的話,可能會(huì)造成某些程序無法順利的運(yùn)行。OK!那么萬一我發(fā)現(xiàn)了一個(gè)文件來自未來,該如何讓該文件的時(shí)間變成『現(xiàn)在』的時(shí)刻呢?很簡(jiǎn)單啊!就用『touch』這個(gè)命令即可!
| Tips: 嘿嘿!不要懷疑系統(tǒng)時(shí)間會(huì)『來自未來』喔!很多時(shí)候會(huì)有這個(gè)問題的!舉例來說在安裝過后系統(tǒng)時(shí)間可能會(huì)被改變!因?yàn)榕_(tái)灣時(shí)區(qū)在國際標(biāo)準(zhǔn)時(shí)間『格林威治時(shí)間, GMT』的右邊,所以會(huì)比較早看到陽光,也就是說,臺(tái)灣時(shí)間比GMT時(shí)間快了八小時(shí)!如果安裝行為不當(dāng),我們的系統(tǒng)可能會(huì)有八小時(shí)快轉(zhuǎn),你的文件就有可能來自八小時(shí)后了。 至於某些情況下,由於BIOS的配置錯(cuò)誤,導(dǎo)致系統(tǒng)時(shí)間跑到未來時(shí)間,并且你又創(chuàng)建了某些文件。等你將時(shí)間改回正確的時(shí)間時(shí),該文件不就變成來自未來了?^_^ |
| [root@www ~]# touch [-acdmt] 文件 選項(xiàng)與參數(shù): -a :僅修訂 access time; -c :僅修改文件的時(shí)間,若該文件不存在則不創(chuàng)建新文件; -d :后面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時(shí)間" -m :僅修改 mtime ; -t :后面可以接欲修訂的時(shí)間而不用目前的時(shí)間,格式為[YYMMDDhhmm]范例一:新建一個(gè)空的文件并觀察時(shí)間 [root@www ~]# cd /tmp [root@www tmp]# touch testtouch [root@www tmp]# ls -l testtouch -rw-r--r-- 1 root root 0 Sep 25 21:09 testtouch # 注意到,這個(gè)文件的大小是 0 呢!在默認(rèn)的狀態(tài)下,如果 touch 后面有接文件, # 則該文件的三個(gè)時(shí)間 (atime/ctime/mtime) 都會(huì)升級(jí)為目前的時(shí)間。若該文件不存在, # 則會(huì)主動(dòng)的創(chuàng)建一個(gè)新的空的文件喔!例如上面這個(gè)例子!范例二:將 ~/.bashrc 復(fù)制成為 bashrc,假設(shè)復(fù)制完全的屬性,檢查其日期 [root@www tmp]# cp -a ~/.bashrc bashrc [root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rw-r--r-- 1 root root 176 Jan 6 2007 bashrc <==這是 mtime -rw-r--r-- 1 root root 176 Sep 25 21:11 bashrc <==這是 atime -rw-r--r-- 1 root root 176 Sep 25 21:12 bashrc <==這是 ctime |
在上面這個(gè)案例當(dāng)中我們使用了『ll』這個(gè)命令(兩個(gè)英文L的小寫),這個(gè)命令其實(shí)就是『ls -l』的意思,ll本身不存在,是被『做出來』的一個(gè)命令別名。相關(guān)的命令別名我們會(huì)在bash章節(jié)當(dāng)中詳談的,這里先知道ll="ls -l"即可。至於分號(hào)『 ; 』則代表連續(xù)命令的下達(dá)啦!你可以在一行命令當(dāng)中寫入多重命令,這些命令可以『依序』運(yùn)行。由上面的命令我們會(huì)知道ll那一行有三個(gè)命令被下達(dá)在同一行中。
至於運(yùn)行的結(jié)果當(dāng)中,我們可以發(fā)現(xiàn)數(shù)據(jù)的內(nèi)容與屬性是被復(fù)制過來的,因此文件內(nèi)容時(shí)間(mtime)與原本文件相同。但是由於這個(gè)文件是剛剛被創(chuàng)建的,因此狀態(tài)(ctime)與讀取時(shí)間就便呈現(xiàn)在的時(shí)間啦!那如果你想要變更這個(gè)文件的時(shí)間呢?可以這樣做:
| 范例三:修改案例二的 bashrc 文件,將日期調(diào)整為兩天前 [root@www tmp]# touch -d "2 days ago" bashrc [root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rw-r--r-- 1 root root 176 Sep 23 21:23 bashrc -rw-r--r-- 1 root root 176 Sep 23 21:23 bashrc -rw-r--r-- 1 root root 176 Sep 25 21:23 bashrc # 跟上個(gè)范例比較看看,本來是 25 日的變成了 23 日了 (atime/mtime)~ # 不過, ctime 并沒有跟著改變喔!范例四:將上個(gè)范例的 bashrc 日期改為 2007/09/15 2:02 [root@www tmp]# touch -t 0709150202 bashrc [root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rw-r--r-- 1 root root 176 Sep 15 2007 bashrc -rw-r--r-- 1 root root 176 Sep 15 2007 bashrc -rw-r--r-- 1 root root 176 Sep 25 21:25 bashrc # 注意看看,日期在 atime 與 mtime 都改變了,但是 ctime 則是記錄目前的時(shí)間! |
透過 touch 這個(gè)命令,我們可以輕易的修訂文件的日期與時(shí)間。并且也可以創(chuàng)建一個(gè)空的文件喔!不過,要注意的是,即使我們復(fù)制一個(gè)文件時(shí),復(fù)制所有的屬性,但也沒有辦法復(fù)制 ctime 這個(gè)屬性的。ctime 可以記錄這個(gè)文件最近的狀態(tài) (status) 被改變的時(shí)間。無論如何,還是要告知大家,我們平時(shí)看的文件屬性中,比較重要的還是屬於那個(gè) mtime 啊!我們關(guān)心的常常是這個(gè)文件的『內(nèi)容』是什么時(shí)候被更動(dòng)的說~了乎?
無論如何, touch 這個(gè)命令最常被使用的情況是:
- 創(chuàng)建一個(gè)空的文件;
- 將某個(gè)文件日期修訂為目前 (mtime 與 atime)
文件與目錄的默認(rèn)權(quán)限與隱藏權(quán)限
由第六章、Linux文件權(quán)限的內(nèi)容我們可以知道一個(gè)文件有若干個(gè)屬性,包括讀寫運(yùn)行(r, w, x)等基本權(quán)限,及是否為目錄 (d) 與文件 (-) 或者是連結(jié)檔 (l) 等等的屬性!要修改屬性的方法在前面也約略提過了(chgrp,chown,chmod),本小節(jié)會(huì)再加強(qiáng)補(bǔ)充一下!
除了基本r, w, x權(quán)限外,在Linux的Ext2/Ext3文件系統(tǒng)下,我們還可以配置其他的系統(tǒng)隱藏屬性,這部份可使用 chattr 來配置,而以 lsattr 來查看,最重要的屬性就是可以配置其不可修改的特性!讓連文件的擁有者都不能進(jìn)行修改!這個(gè)屬性可是相當(dāng)重要的,尤其是在安全機(jī)制上面 (security)!
首先,先來復(fù)習(xí)一下上一章談到的權(quán)限概念,將底下的例題看一看先:
| 例題: 你的系統(tǒng)有個(gè)一般身份使用者 dmtsai,他的群組屬於 users,他的家目錄在 /home/dmtsai,你是root,你想將你的 ~/.bashrc 復(fù)制給他,可以怎么作? 答: 由上一章的權(quán)限概念我們可以知道 root 雖然可以將這個(gè)文件復(fù)制給 dmtsai,不過這個(gè)文件在 dmtsai的家目錄中卻可能讓 dmtsai 沒有辦法讀寫(因?yàn)樵撐募凫?root 的嘛!而 dmtsai 又不能使用 chown 之故)。此外,我們又擔(dān)心覆蓋掉 dmtsai 自己的 .bashrc 配置檔,因此,我們可以進(jìn)行如下的動(dòng)作喔: 復(fù)制文件: cp ~/.bashrc ~dmtsai/bashrc 修改屬性: chown dmtsai:users ~dmtsai/bashrc |
| 例題: 我想在 /tmp 底下創(chuàng)建一個(gè)目錄,這個(gè)目錄名稱為 chapter7_1 ,并且這個(gè)目錄擁有者為 dmtsai,群組為 users ,此外,任何人都可以進(jìn)入該目錄瀏覽文件,不過除了 dmtsai 之外,其他人都不能修改該目錄下的文件。 答: 因?yàn)槌?dmtsai 之外,其他人不能修改該目錄下的文件,所以整個(gè)目錄的權(quán)限應(yīng)該是 drwxr-xr-x 才對(duì)!因此你應(yīng)該這樣做: 創(chuàng)建目錄: mkdir /tmp/chapter7_1 修改屬性: chown -R dmtsai:users /tmp/chapter7_1 修改權(quán)限: chmod -R 755 /tmp/chapter7_1 |
在上面這個(gè)例題當(dāng)中,如果你知道 755 那個(gè)分?jǐn)?shù)是怎么計(jì)算出來的,那么你應(yīng)該對(duì)於權(quán)限有一定程度的概念了。如果你不知道 755 怎么來的?那么...趕快回去前一章看看chmod 那個(gè)命令的介紹部分啊!這部分很重要喔!你得要先清楚的了解到才行~否則就進(jìn)行不下去羅~假設(shè)你對(duì)於權(quán)限都認(rèn)識(shí)的差不多了,那么底下我們就要來談一談,『新增一個(gè)文件或目錄時(shí),默認(rèn)的權(quán)限是什么?』這個(gè)議題!
文件默認(rèn)權(quán)限:umask
OK!那么現(xiàn)在我們知道如何創(chuàng)建或者是改變一個(gè)目錄或文件的屬性了,不過,你知道當(dāng)你創(chuàng)建一個(gè)新的文件或目錄時(shí),他的默認(rèn)權(quán)限會(huì)是什么嗎?呵呵!那就與 umask 這個(gè)玩意兒有關(guān)了!那么 umask 是在搞什么呢?基本上, umask 就是指定『目前使用者在創(chuàng)建文件或目錄時(shí)候的權(quán)限默認(rèn)值』,那么如何得知或配置 umask 呢?他的指定條件以底下的方式來指定:
| [root@www ~]# umask 0022 <==與一般權(quán)限有關(guān)的是后面三個(gè)數(shù)字! [root@www ~]# umask -S u=rwx,g=rx,o=rx |
查閱的方式有兩種,一種可以直接輸入 umask ,就可以看到數(shù)字型態(tài)的權(quán)限配置分?jǐn)?shù),一種則是加入 -S (Symbolic) 這個(gè)選項(xiàng),就會(huì)以符號(hào)類型的方式來顯示出權(quán)限了!奇怪的是,怎么 umask 會(huì)有四組數(shù)字啊?不是只有三組嗎?是沒錯(cuò)啦。第一組是特殊權(quán)限用的,我們先不要理他,所以先看后面三組即可。
在默認(rèn)權(quán)限的屬性上,目錄與文件是不一樣的。從第六章我們知道 x 權(quán)限對(duì)於目錄是非常重要的!但是一般文件的創(chuàng)建則不應(yīng)該有運(yùn)行的權(quán)限,因?yàn)橐话阄募ǔJ怯迷陟稊?shù)據(jù)的記錄嘛!當(dāng)然不需要運(yùn)行的權(quán)限了。因此,默認(rèn)的情況如下:
- 若使用者創(chuàng)建為『文件』則默認(rèn)『沒有可運(yùn)行( x )權(quán)限』,亦即只有 rw 這兩個(gè)項(xiàng)目,也就是最大為 666 分,默認(rèn)權(quán)限如下:
-rw-rw-rw-
- 若使用者創(chuàng)建為『目錄』,則由於 x 與是否可以進(jìn)入此目錄有關(guān),因此默認(rèn)為所有權(quán)限均開放,亦即為 777 分,默認(rèn)權(quán)限如下:
drwxrwxrwx
要注意的是,umask 的分?jǐn)?shù)指的是『該默認(rèn)值需要減掉的權(quán)限!』因?yàn)?r、w、x 分別是 4、2、1 分,所以羅!也就是說,當(dāng)要拿掉能寫的權(quán)限,就是輸入 2 分,而如果要拿掉能讀的權(quán)限,也就是 4 分,那么要拿掉讀與寫的權(quán)限,也就是 6 分,而要拿掉運(yùn)行與寫入的權(quán)限,也就是 3 分,這樣了解嗎?請(qǐng)問你, 5 分是什么?呵呵!就是讀與運(yùn)行的權(quán)限啦!
如果以上面的例子來說明的話,因?yàn)?umask 為 022 ,所以 user 并沒有被拿掉任何權(quán)限,不過 group 與 others 的權(quán)限被拿掉了 2 (也就是 w 這個(gè)權(quán)限),那么當(dāng)使用者:
- 創(chuàng)建文件時(shí):(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
- 創(chuàng)建目錄時(shí):(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
| [root@www ~]# umask 0022 [root@www ~]# touch test1 [root@www ~]# mkdir test2 [root@www ~]# ll -rw-r--r-- 1 root root 0 Sep 27 00:25 test1 drwxr-xr-x 2 root root 4096 Sep 27 00:25 test2 |
呵呵!瞧見了吧!確定新建文件的權(quán)限是沒有錯(cuò)的。
- umask的利用與重要性:專題制作
想像一個(gè)狀況,如果你跟你的同學(xué)在同一部主機(jī)里面工作時(shí),因?yàn)槟銈儍蓚€(gè)正在進(jìn)行同一個(gè)專題,老師也幫你們兩個(gè)的帳號(hào)創(chuàng)建好了相同群組的狀態(tài),并且將 /home/class/ 目錄做為你們兩個(gè)人的專題目錄。想像一下,有沒有可能你所制作的文件你的同學(xué)無法編輯?果真如此的話,那就傷腦筋了!
這個(gè)問題很常發(fā)生啊!舉上面的案例來看就好了,你看一下 test1 的權(quán)限是幾分? 644 呢!意思是『如果 umask 訂定為 022 ,那新建的數(shù)據(jù)只有使用者自己具有 w 的權(quán)限,同群組的人只有 r 這個(gè)可讀的權(quán)限而已,并無法修改喔!』這樣要怎么共同制作專題啊!您說是吧!
所以,當(dāng)我們需要新建文件給同群組的使用者共同編輯時(shí),那么 umask 的群組就不能拿掉 2 這個(gè) w 的權(quán)限!所以羅, umask 就得要是 002 之類的才可以!這樣新建的文件才能夠是 -rw-rw-r-- 的權(quán)限模樣喔!那么如何配置 umask 呢?簡(jiǎn)單的很,直接在 umask 后面輸入 002 就好了!
| [root@www ~]# umask 002 [root@www ~]# touch test3 [root@www ~]# mkdir test4 [root@www ~]# ll -rw-rw-r-- 1 root root 0 Sep 27 00:36 test3 drwxrwxr-x 2 root root 4096 Sep 27 00:36 test4 |
所以說,這個(gè) umask 對(duì)於新建文件與目錄的默認(rèn)權(quán)限是很有關(guān)系的!這個(gè)概念可以用在任何服務(wù)器上面,尤其是未來在你架設(shè)文件服務(wù)器 (file server) ,舉例來說,SAMBA Server 或者是FTP server 時(shí),都是很重要的觀念!這牽涉到你的使用者是否能夠?qū)⑽募M(jìn)一步利用的問題喔!不要等閑視之!
| 例題: 假設(shè)你的 umask 為 003 ,請(qǐng)問該 umask 情況下,創(chuàng)建的文件與目錄權(quán)限為? 答: umask 為 003 ,所以拿掉的權(quán)限為 --------wx,因此: 文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r-- 目錄: (drwxrwxrwx) - (--------wx) = drwxrwxr-- |
| Tips: 關(guān)於 umask 與權(quán)限的計(jì)算方式中,教科書喜歡使用二進(jìn)位的方式來進(jìn)行 AND 與 NOT 的計(jì)算,不過,鳥哥還是比較喜歡使用符號(hào)方式來計(jì)算~聯(lián)想上面比較容易一點(diǎn)~ 但是,有的書籍或者是 BBS 上面的朋友,喜歡使用文件默認(rèn)屬性 666 與目錄默認(rèn)屬性777 來與 umask 進(jìn)行相減的計(jì)算~這是不好的喔!以上面例題來看,如果使用默認(rèn)屬性相加減,則文件變成:666-003=663,亦即是 -rw-rw--wx ,這可是完全不對(duì)的喔!想想看,原本文件就已經(jīng)去除 x 的默認(rèn)屬性了,怎么可能突然間冒出來了?所以,這個(gè)地方得要特別小心喔! |
在默認(rèn)的情況中, root 的 umask 會(huì)拿掉比較多的屬性,root 的 umask 默認(rèn)是 022 ,這是基於安全的考量啦~至於一般身份使用者,通常他們的 umask 為 002 ,亦即保留同群組的寫入權(quán)力!其實(shí),關(guān)於默認(rèn) umask 的配置可以參考 /etc/bashrc 這個(gè)文件的內(nèi)容,不過,不建議修改該文件,你可以參考第十一章 bash shell 提到的環(huán)境參數(shù)配置檔(~/.bashrc) 的說明!
文件隱藏屬性:
什么?文件還有隱藏屬性?光是那九個(gè)權(quán)限就快要瘋掉了,竟然還有隱藏屬性,真是要命~但是沒辦法,就是有文件的隱藏屬性存在啊!不過,這些隱藏的屬性確實(shí)對(duì)於系統(tǒng)有很大的幫助的~尤其是在系統(tǒng)安全 (Security) 上面,重要的緊呢!不過要先強(qiáng)調(diào)的是,底下的chattr命令只能在Ext2/Ext3的文件系統(tǒng)上面生效,其他的文件系統(tǒng)可能就無法支持這個(gè)命令了。底下我們就來談一談如何配置與檢查這些隱藏的屬性吧!
- chattr (配置文件隱藏屬性)
| [root@www ~]# chattr [+-=][ASacdistu] 文件或目錄名稱 選項(xiàng)與參數(shù): + :添加某一個(gè)特殊參數(shù),其他原本存在參數(shù)則不動(dòng)。 - :移除某一個(gè)特殊參數(shù),其他原本存在參數(shù)則不動(dòng)。 = :配置一定,且僅有后面接的參數(shù)A :當(dāng)配置了 A 這個(gè)屬性時(shí),若你有存取此文件(或目錄)時(shí),他的存取時(shí)間 atime將不會(huì)被修改,可避免I/O較慢的機(jī)器過度的存取磁碟。這對(duì)速度較慢的計(jì)算機(jī)有幫助 S :一般文件是非同步寫入磁碟的(原理請(qǐng)參考第五章sync的說明),如果加上 S 這個(gè)屬性時(shí),當(dāng)你進(jìn)行任何文件的修改,該更動(dòng)會(huì)『同步』寫入磁碟中。 a :當(dāng)配置 a 之后,這個(gè)文件將只能添加數(shù)據(jù),而不能刪除也不能修改數(shù)據(jù),只有root 才能配置這個(gè)屬性。 c :這個(gè)屬性配置之后,將會(huì)自動(dòng)的將此文件『壓縮』,在讀取的時(shí)候?qū)?huì)自動(dòng)解壓縮,但是在儲(chǔ)存的時(shí)候,將會(huì)先進(jìn)行壓縮后再儲(chǔ)存(看來對(duì)於大文件似乎蠻有用的!) d :當(dāng) dump 程序被運(yùn)行的時(shí)候,配置 d 屬性將可使該文件(或目錄)不會(huì)被 dump 備份 i :這個(gè) i 可就很厲害了!他可以讓一個(gè)文件『不能被刪除、改名、配置連結(jié)也無法寫入或新增數(shù)據(jù)!』對(duì)於系統(tǒng)安全性有相當(dāng)大的助益!只有 root 能配置此屬性 s :當(dāng)文件配置了 s 屬性時(shí),如果這個(gè)文件被刪除,他將會(huì)被完全的移除出這個(gè)硬盤空間,所以如果誤刪了,完全無法救回來了喔! u :與 s 相反的,當(dāng)使用 u 來配置文件時(shí),如果該文件被刪除了,則數(shù)據(jù)內(nèi)容其實(shí)還存在磁碟中,可以使用來救援該文件喔! 注意:屬性配置常見的是 a 與 i 的配置值,而且很多配置值必須要身為 root 才能配置范例:請(qǐng)嘗試到/tmp底下創(chuàng)建文件,并加入 i 的參數(shù),嘗試刪除看看。 [root@www ~]# cd /tmp [root@www tmp]# touch attrtest <==創(chuàng)建一個(gè)空文件 [root@www tmp]# chattr +i attrtest <==給予 i 的屬性 [root@www tmp]# rm attrtest <==嘗試刪除看看 rm: remove write-protected regular empty file `attrtest'? y rm: cannot remove `attrtest': Operation not permitted <==操作不許可 # 看到了嗎?呼呼!連 root 也沒有辦法將這個(gè)文件刪除呢!趕緊解除配置!范例:請(qǐng)將該文件的 i 屬性取消! [root@www tmp]# chattr -i attrtest |
這個(gè)命令是很重要的,尤其是在系統(tǒng)的數(shù)據(jù)安全上面!由於這些屬性是隱藏的性質(zhì),所以需要以 lsattr 才能看到該屬性呦!其中,個(gè)人認(rèn)為最重要的當(dāng)屬 +i 與 +a這個(gè)屬性了。+i 可以讓一個(gè)文件無法被更動(dòng),對(duì)於需要強(qiáng)烈的系統(tǒng)安全的人來說,真是相當(dāng)?shù)闹匾?#xff01;里頭還有相當(dāng)多的屬性是需要 root 才能配置的呢!
此外,如果是 log file 這種的登錄檔,就更需要 +a 這個(gè)可以添加,但是不能修改舊有的數(shù)據(jù)與刪除的參數(shù)了!怎樣?很棒吧!未來提到登錄檔 (十九章) 的認(rèn)知時(shí),我們?cè)賮砹囊涣娜绾闻渲盟?#xff01;
- lsattr (顯示文件隱藏屬性)
| [root@www ~]# lsattr [-adR] 文件或目錄 選項(xiàng)與參數(shù): -a :將隱藏檔的屬性也秀出來; -d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內(nèi)的檔名; -R :連同子目錄的數(shù)據(jù)也一并列出來! [root@www tmp]# chattr +aij attrtest [root@www tmp]# lsattr attrtest ----ia---j--- attrtest |
使用 chattr 配置后,可以利用 lsattr 來查閱隱藏的屬性。不過,這兩個(gè)命令在使用上必須要特別小心,否則會(huì)造成很大的困擾。例如:某天你心情好,突然將 /etc/shadow 這個(gè)重要的密碼記錄文件給他配置成為具有 i 的屬性,那么過了若干天之后,你突然要新增使用者,卻一直無法新增!別懷疑,趕快去將 i 的屬性拿掉吧!
文件特殊權(quán)限:SUID, SGID, SBIT
我們前面一直提到關(guān)於文件的重要權(quán)限,那就是 rwx 這三個(gè)讀、寫、運(yùn)行的權(quán)限。但是,眼尖的朋友們?cè)诘诹碌哪夸洏湔鹿?jié)中,一定注意到了一件事,那就是,怎么我們的 /tmp 權(quán)限怪怪的?還有,那個(gè) /usr/bin/passwd 也怪怪的?怎么回事啊?看看先:
| [root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp -rwsr-xr-x 1 root root 22984 Jan 7 2007 /usr/bin/passwd |
不是應(yīng)該只有 rwx 嗎?還有其他的特殊權(quán)限( s 跟 t )啊?啊.....頭又開始昏了~ @_@因?yàn)?s 與 t 這兩個(gè)權(quán)限的意義與系統(tǒng)的帳號(hào) (第十四章)及系統(tǒng)的程序(process, 第十七章)較為相關(guān),所以等到后面的章節(jié)談完后你才會(huì)比較有概念!底下的說明先看看就好,如果看不懂也沒有關(guān)系,先知道s放在哪里稱為SUID/SGID以及如何配置即可,等系統(tǒng)程序章節(jié)讀完后,再回來看看喔!
- Set UID
當(dāng) s 這個(gè)標(biāo)志出現(xiàn)在文件擁有者的 x 權(quán)限上時(shí),例如剛剛提到的 /usr/bin/passwd 這個(gè)文件的權(quán)限狀態(tài):『-rwsr-xr-x』,此時(shí)就被稱為 Set UID,簡(jiǎn)稱為 SUID 的特殊權(quán)限。那么SUID的權(quán)限對(duì)於一個(gè)文件的特殊功能是什么呢?基本上SUID有這樣的限制與功能:
- SUID 權(quán)限僅對(duì)二進(jìn)位程序(binary program)有效;
- 運(yùn)行者對(duì)於該程序需要具有 x 的可運(yùn)行權(quán)限;
- 本權(quán)限僅在運(yùn)行該程序的過程中有效 (run-time);
- 運(yùn)行者將具有該程序擁有者 (owner) 的權(quán)限。
講這么硬的東西你可能對(duì)於 SUID 還是沒有概念,沒關(guān)系,我們舉個(gè)例子來說明好了。我們的 Linux 系統(tǒng)中,所有帳號(hào)的密碼都記錄在 /etc/shadow 這個(gè)文件里面,這個(gè)文件的權(quán)限為:『-r-------- 1 root root』,意思是這個(gè)文件僅有root可讀且僅有root可以強(qiáng)制寫入而已。既然這個(gè)文件僅有 root 可以修改,那么鳥哥的 vbird 這個(gè)一般帳號(hào)使用者能否自行修改自己的密碼呢?你可以使用你自己的帳號(hào)輸入『passwd』這個(gè)命令來看看,嘿嘿!一般使用者當(dāng)然可以修改自己的密碼了!
唔!有沒有沖突啊!明明 /etc/shadow 就不能讓 vbird 這個(gè)一般帳戶去存取的,為什么 vbird 還能夠修改這個(gè)文件內(nèi)的密碼呢?這就是 SUID 的功能啦!藉由上述的功能說明,我們可以知道
但如果 vbird 使用 cat 去讀取 /etc/shadow 時(shí),他能夠讀取嗎?因?yàn)?cat 不具有 SUID 的權(quán)限,所以 vbird 運(yùn)行 『cat /etc/shadow』時(shí),是不能讀取 /etc/shadow 的。我們用一張示意圖來說明如下:
圖4.4.1、SUID程序運(yùn)行的過程示意圖
另外,SUID 僅可用在binary program 上,不能夠用在 shell script 上面!這是因?yàn)?shell script 只是將很多的 binary 運(yùn)行檔叫進(jìn)來運(yùn)行而已!所以 SUID 的權(quán)限部分,還是得要看 shell script 呼叫進(jìn)來的程序的配置,而不是 shell script 本身。當(dāng)然,SUID 對(duì)於目錄也是無效的~這點(diǎn)要特別留意。
- Set GID
當(dāng) s 標(biāo)志在文件擁有者的 x 項(xiàng)目為 SUID,那 s 在群組的 x 時(shí)則稱為 Set GID, SGID 羅!是這樣沒錯(cuò)!^_^。舉例來說,你可以用底下的命令來觀察到具有 SGID 權(quán)限的文件喔:
| [root@www ~]# ls -l /usr/bin/locate -rwx--s--x 1 root slocate 23856 Mar 15 2007 /usr/bin/locate |
與 SUID 不同的是,SGID 可以針對(duì)文件或目錄來配置!如果是對(duì)文件來說, SGID 有如下的功能:
- SGID 對(duì)二進(jìn)位程序有用;
- 程序運(yùn)行者對(duì)於該程序來說,需具備 x 的權(quán)限;
- 運(yùn)行者在運(yùn)行的過程中將會(huì)獲得該程序群組的支持!
舉例來說,上面的 /usr/bin/locate 這個(gè)程序可以去搜尋 /var/lib/mlocate/mlocate.db 這個(gè)文件的內(nèi)容 (詳細(xì)說明會(huì)在下節(jié)講述),mlocate.db 的權(quán)限如下:
| [root@www ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db -rwx--s--x 1 root slocate 23856 Mar 15 2007 /usr/bin/locate -rw-r----- 1 root slocate 3175776 Sep 28 04:02 /var/lib/mlocate/mlocate.db |
與 SUID 非常的類似,若我使用 vbird 這個(gè)帳號(hào)去運(yùn)行 locate 時(shí),那 vbird 將會(huì)取得 slocate 群組的支持,因此就能夠去讀取 mlocate.db 啦!非常有趣吧!
除了 binary program 之外,事實(shí)上 SGID 也能夠用在目錄上,這也是非常常見的一種用途!當(dāng)一個(gè)目錄配置了 SGID 的權(quán)限后,他將具有如下的功能:
- 使用者若對(duì)於此目錄具有 r 與 x 的權(quán)限時(shí),該使用者能夠進(jìn)入此目錄;
- 使用者在此目錄下的有效群組(effective group)將會(huì)變成該目錄的群組;
- 用途:若使用者在此目錄下具有 w 的權(quán)限(可以新建文件),則使用者所創(chuàng)建的新文件,該新文件的群組與此目錄的群組相同。
SGID 對(duì)於專案開發(fā)來說是非常重要的!因?yàn)檫@涉及群組權(quán)限的問題,您可以參考一下本章后續(xù)情境模擬的案例,應(yīng)該就能夠?qū)?SGID 有一些了解的!^_^
- Sticky Bit
這個(gè) Sticky Bit, SBIT 目前只針對(duì)目錄有效,對(duì)於文件已經(jīng)沒有效果了。SBIT 對(duì)於目錄的作用是:
- 當(dāng)使用者對(duì)於此目錄具有 w, x 權(quán)限,亦即具有寫入的權(quán)限時(shí);
- 當(dāng)使用者在該目錄下創(chuàng)建文件或目錄時(shí),僅有自己與 root 才有權(quán)力刪除該文件
換句話說:當(dāng)甲這個(gè)使用者於 A 目錄是具有群組或其他人的身份,并且擁有該目錄 w 的權(quán)限,這表示『甲使用者對(duì)該目錄內(nèi)任何人創(chuàng)建的目錄或文件均可進(jìn)行 "刪除/更名/搬移" 等動(dòng)作?!徊贿^,如果將 A 目錄加上了 SBIT 的權(quán)限項(xiàng)目時(shí),則甲只能夠針對(duì)自己創(chuàng)建的文件或目錄進(jìn)行刪除/更名/移動(dòng)等動(dòng)作,而無法刪除他人的文件。
舉例來說,我們的 /tmp 本身的權(quán)限是『drwxrwxrwt』,在這樣的權(quán)限內(nèi)容下,任何人都可以在 /tmp 內(nèi)新增、修改文件,但僅有該文件/目錄創(chuàng)建者與 root 能夠刪除自己的目錄或文件。這個(gè)特性也是挺重要的啊!你可以這樣做個(gè)簡(jiǎn)單的測(cè)試:
由於 SUID/SGID/SBIT 牽涉到程序的概念,因此再次強(qiáng)調(diào),這部份的數(shù)據(jù)在您讀完第十七章關(guān)於程序方面的知識(shí)后,要再次的回來瞧瞧喔!目前,你先有個(gè)簡(jiǎn)單的基礎(chǔ)概念就好了!文末的參考數(shù)據(jù)也建議閱讀一番喔!
- SUID/SGID/SBIT 權(quán)限配置
前面介紹過 SUID 與 SGID 的功能,那么如何配置文件使成為具有 SUID 與 SGID 的權(quán)限呢?這就需要第六章的數(shù)字更改權(quán)限的方法了!現(xiàn)在你應(yīng)該已經(jīng)知道數(shù)字型態(tài)更改權(quán)限的方式為『三個(gè)數(shù)字』的組合,那么如果在這三個(gè)數(shù)字之前再加上一個(gè)數(shù)字的話,最前面的那個(gè)數(shù)字就代表這幾個(gè)權(quán)限了!
- 4 為 SUID
- 2 為 SGID
- 1 為 SBIT
假設(shè)要將一個(gè)文件權(quán)限改為『-rwsr-xr-x』時(shí),由於 s 在使用者權(quán)限中,所以是 SUID ,因此,在原先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來配置!此外,還有大 S 與大 T 的產(chǎn)生喔!參考底下的范例啦!
| Tips: 注意:底下的范例只是練習(xí)而已,所以鳥哥使用同一個(gè)文件來配置,你必須了解SUID 不是用在目錄上,而 SBIT 不是用在文件上的喔! |
| [root@www ~]# cd /tmp [root@www tmp]# touch test <==創(chuàng)建一個(gè)測(cè)試用空檔 [root@www tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的權(quán)限 -rwsr-xr-x 1 root root 0 Sep 29 03:06 test [root@www tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的權(quán)限 -rwsr-sr-x 1 root root 0 Sep 29 03:06 test [root@www tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能! -rwxr-xr-t 1 root root 0 Sep 29 03:06 test [root@www tmp]# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 權(quán)限 -rwSrwSrwT 1 root root 0 Sep 29 03:06 test |
最后一個(gè)例子就要特別小心啦!怎么會(huì)出現(xiàn)大寫的 S 與 T 呢?不都是小寫的嗎?因?yàn)?s 與 t 都是取代 x 這個(gè)權(quán)限的,但是你有沒有發(fā)現(xiàn)阿,我們是下達(dá) 7666 喔!也就是說,user, group 以及 others 都沒有 x 這個(gè)可運(yùn)行的標(biāo)志( 因?yàn)?666 嘛 ),所以,這個(gè) S, T 代表的就是『空的』啦!怎么說? SUID 是表示『該文件在運(yùn)行的時(shí)候,具有文件擁有者的權(quán)限』,但是文件擁有者都無法運(yùn)行了,哪里來的權(quán)限給其他人使用?當(dāng)然就是空的啦! ^_^
而除了數(shù)字法之外,你也可以透過符號(hào)法來處理喔!其中 SUID 為 u+s ,而 SGID 為 g+s ,SBIT則是 o+t 羅!來看看如下的范例:
| # 配置權(quán)限成為 -rws--x--x 的模樣: [root@www tmp]# chmod u=rwxs,go=x test; ls -l test -rws--x--x 1 root root 0 Aug 18 23:47 test# 承上,加上 SGID 與 SBIT 在上述的文件權(quán)限中! [root@www tmp]# chmod g+s,o+t test; ls -l test -rws--s--t 1 root root 0 Aug 18 23:47 test |
觀察文件類型:file
如果你想要知道某個(gè)文件的基本數(shù)據(jù),例如是屬於 ASCII 或者是 data 文件,或者是 binary ,且其中有沒有使用到動(dòng)態(tài)函式庫 (share library) 等等的資訊,就可以利用 file 這個(gè)命令來檢閱喔!舉例來說:
| [root@www ~]# file ~/.bashrc /root/.bashrc: ASCII text <==告訴我們是 ASCII 的純文字檔啊! [root@www ~]# file /usr/bin/passwd /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped # 運(yùn)行檔的數(shù)據(jù)可就多的不得了!包括這個(gè)文件的 suid 權(quán)限、兼容於 Intel 386 # 等級(jí)的硬件平臺(tái)、使用的是 Linux 核心 2.6.9 的動(dòng)態(tài)函式庫連結(jié)等等。 [root@www ~]# file /var/lib/mlocate/mlocate.db /var/lib/mlocate/mlocate.db: data <== 這是 data 文件! |
透過這個(gè)命令,我們可以簡(jiǎn)單的先判斷這個(gè)文件的格式為何喔!
命令與文件的搜尋:
文件的搜尋可就厲害了!因?yàn)槲覀兂3P枰滥莻€(gè)文件放在哪里,才能夠?qū)υ撐募M(jìn)行一些修改或維護(hù)等動(dòng)作。有些時(shí)候某些軟件配置檔的檔名是不變的,但是各 distribution 放置的目錄則不同。此時(shí)就得要利用一些搜尋命令將該配置檔的完整檔名捉出來,這樣才能修改嘛!您說是吧!^_^
命令檔名的搜尋:
我們知道在終端機(jī)模式當(dāng)中,連續(xù)輸入兩次[tab]按鍵就能夠知道使用者有多少命令可以下達(dá)。那你知不知道這些命令的完整檔名放在哪里?舉例來說,ls 這個(gè)常用的命令放在哪里呢?就透過 which 或 type 來找尋吧!
- which (尋找『運(yùn)行檔』)
| [root@www ~]# which [-a] command 選項(xiàng)或參數(shù): -a :將所有由 PATH 目錄中可以找到的命令均列出,而不止第一個(gè)被找到的命令名稱范例一:分別用root與一般帳號(hào)搜尋 ifconfig 這個(gè)命令的完整檔名 [root@www ~]# which ifconfig /sbin/ifconfig <==用 root 可以找到正確的運(yùn)行檔名喔! [root@www ~]# su - vbird <==切換身份成為 vbird 去! [vbird@www ~]$ which ifconfig /usr/bin/which: no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin :/home/vbird/bin) <==見鬼了!竟然一般身份帳號(hào)找不到! # 因?yàn)?which 是根據(jù)使用者所配置的 PATH 變量內(nèi)的目錄去搜尋可運(yùn)行檔的!所以, # 不同的 PATH 配置內(nèi)容所找到的命令當(dāng)然不一樣啦!因?yàn)?/sbin 不在 vbird 的 # PATH 中,找不到也是理所當(dāng)然的啊!了乎? [vbird@www ~]$ exit <==記得將身份切換回原本的 root范例二:用 which 去找出 which 的檔名為何? [root@www ~]# which which alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot '/usr/bin/which # 竟然會(huì)有兩個(gè) which ,其中一個(gè)是 alias 這玩意兒呢!那是啥? # 那就是所謂的『命令別名』,意思是輸入 which 會(huì)等於后面接的那串命令啦! # 更多的數(shù)據(jù)我們會(huì)在 bash 章節(jié)中再來談的!范例三:請(qǐng)找出 cd 這個(gè)命令的完整檔名 [root@www ~]# which cd /usr/bin/which: no cd in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin :/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin) # 瞎密?怎么可能沒有 cd ,我明明就能夠用 root 運(yùn)行 cd 的啊! |
這個(gè)命令是根據(jù)『PATH』這個(gè)環(huán)境變量所規(guī)范的路徑,去搜尋『運(yùn)行檔』的檔名~所以,重點(diǎn)是找出『運(yùn)行檔』而已!且 which 后面接的是『完整檔名』喔!若加上 -a選項(xiàng),則可以列出所有的可以找到的同名運(yùn)行檔,而非僅顯示第一個(gè)而已!
最后一個(gè)范例最有趣,怎么 cd 這個(gè)常用的命令竟然找不到啊!為什么呢?這是因?yàn)?cd 是『bash 內(nèi)建的命令』啦!但是 which 默認(rèn)是找 PATH 內(nèi)所規(guī)范的目錄,所以當(dāng)然一定找不到的啊!那怎辦?沒關(guān)系!我們可以透過 type 這個(gè)命令喔!關(guān)於 type 的用法我們將在第十一章的 bash 再來談!
文件檔名的搜尋:
再來談一談怎么搜尋文件吧!在 Linux 底下也有相當(dāng)優(yōu)異的搜尋命令呦!通常 find 不很常用的!因?yàn)樗俣嚷?#xff0c;也很操硬盤!通常我們都是先使用 whereis 或者是 locate 來檢查,如果真的找不到了,才以 find 來搜尋呦!為什么呢?因?yàn)?whereis 與 locate 是利用數(shù)據(jù)庫來搜尋數(shù)據(jù),所以相當(dāng)?shù)目焖?#xff0c;而且并沒有實(shí)際的搜尋硬盤,比較省時(shí)間啦!
- whereis (尋找特定文件)
| [root@www ~]# whereis [-bmsu] 文件或目錄名 選項(xiàng)與參數(shù): -b :只找 binary 格式的文件 -m :只找在說明檔 manual 路徑下的文件 -s :只找 source 來源文件 -u :搜尋不在上述三個(gè)項(xiàng)目當(dāng)中的其他特殊文件范例一:請(qǐng)用不同的身份找出 ifconfig 這個(gè)檔名 [root@www ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz [root@www ~]# su - vbird <==切換身份成為 vbird [vbird@www ~]$ whereis ifconfig <==找到同樣的結(jié)果喔! ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz [vbird@www ~]$ exit <==回歸身份成為 root 去! # 注意看,明明 which 一般使用者找不到的 ifconfig 卻可以讓 whereis 找到! # 這是因?yàn)橄到y(tǒng)真的有 ifconfig 這個(gè)『文件』,但是使用者的 PATH 并沒有加入 /sbin # 所以,未來你找不到某些命令時(shí),先用文件搜尋命令找找看再說!范例二:只找出跟 passwd 有關(guān)的『說明文件』檔名(man page) [root@www ~]# whereis -m passwd passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz |
等一下我們會(huì)提到 find 這個(gè)搜尋命令, find 是很強(qiáng)大的搜尋命令,但時(shí)間花用的很大!(因?yàn)?find 是直接搜尋硬盤,為如果你的硬盤比較老舊的話,嘿嘿!有的等!) 這個(gè)時(shí)候 whereis 就相當(dāng)?shù)暮糜昧?#xff01;另外, whereis 可以加入選項(xiàng)來找尋相關(guān)的數(shù)據(jù),例如如果你是要找可運(yùn)行檔( binary )那么加上 -b 就可以啦!如果不加任何選項(xiàng)的話,那么就將所有的數(shù)據(jù)列出來羅!
那么 whereis 到底是使用什么咚咚呢?為何搜尋的速度會(huì)比 find 快這么多?其實(shí)那也沒有什么!這是因?yàn)?Linux 系統(tǒng)會(huì)將系統(tǒng)內(nèi)的所有文件都記錄在一個(gè)數(shù)據(jù)庫文件里面,而當(dāng)使用 whereis 或者是底下要說的 locate 時(shí),都會(huì)以此數(shù)據(jù)庫文件的內(nèi)容為準(zhǔn),因此,有的時(shí)后你還會(huì)發(fā)現(xiàn)使用這兩個(gè)運(yùn)行檔時(shí),會(huì)找到已經(jīng)被殺掉的文件!而且也找不到最新的剛剛創(chuàng)建的文件呢!這就是因?yàn)檫@兩個(gè)命令是由數(shù)據(jù)庫當(dāng)中的結(jié)果去搜尋文件的所在啊!更多與這個(gè)數(shù)據(jù)庫有關(guān)的說明,請(qǐng)參考下列的 locate 命令。
- locate
| [root@www ~]# locate [-ir] keyword 選項(xiàng)與參數(shù): -i :忽略大小寫的差異; -r :后面可接正規(guī)表示法的顯示方式范例一:找出系統(tǒng)中所有與 passwd 相關(guān)的檔名 [root@www ~]# locate passwd /etc/passwd /etc/passwd- /etc/news/passwd.nntp /etc/pam.d/passwd ....(底下省略).... |
這個(gè) locate 的使用更簡(jiǎn)單,直接在后面輸入『文件的部分名稱』后,就能夠得到結(jié)果。舉上面的例子來說,我輸入 locate passwd ,那么在完整檔名 (包含路徑名稱) 當(dāng)中,只要有 passwd 在其中,就會(huì)被顯示出來的!這也是個(gè)很方便好用的命令,如果你忘記某個(gè)文件的完整檔名時(shí)~~
但是,這個(gè)東西還是有使用上的限制呦!為什么呢?你會(huì)發(fā)現(xiàn)使用 locate 來尋找數(shù)據(jù)的時(shí)候特別的快,這是因?yàn)?locate 尋找的數(shù)據(jù)是由『已創(chuàng)建的數(shù)據(jù)庫 /var/lib/mlocate/』里面的數(shù)據(jù)所搜尋到的,所以不用直接在去硬盤當(dāng)中存取數(shù)據(jù),呵呵!當(dāng)然是很快速羅!
那么有什么限制呢?就是因?yàn)樗墙?jīng)由數(shù)據(jù)庫來搜尋的,而數(shù)據(jù)庫的創(chuàng)建默認(rèn)是在每天運(yùn)行一次(每個(gè) distribution 都不同,CentOS 5.x 是每天升級(jí)數(shù)據(jù)庫一次!),所以當(dāng)你新創(chuàng)建起來的文件,卻還在數(shù)據(jù)庫升級(jí)之前搜尋該文件,那么 locate 會(huì)告訴你『找不到!』呵呵!因?yàn)楸仨氁?jí)數(shù)據(jù)庫呀!
那能否手動(dòng)升級(jí)數(shù)據(jù)庫哪?當(dāng)然可以啊!升級(jí) locate 數(shù)據(jù)庫的方法非常簡(jiǎn)單,直接輸入『 updatedb 』就可以了!updatedb 命令會(huì)去讀取 /etc/updatedb.conf 這個(gè)配置檔的配置,然后再去硬盤里面進(jìn)行搜尋檔名的動(dòng)作,最后就升級(jí)整個(gè)數(shù)據(jù)庫文件羅!因?yàn)?updatedb 會(huì)去搜尋硬盤,所以當(dāng)你運(yùn)行 updatedb 時(shí),可能會(huì)等待數(shù)分鐘的時(shí)間喔!
- updatedb:根據(jù) /etc/updatedb.conf 的配置去搜尋系統(tǒng)硬盤內(nèi)的檔名,并升級(jí) /var/lib/mlocate 內(nèi)的數(shù)據(jù)庫文件;
- locate:依據(jù) /var/lib/mlocate 內(nèi)的數(shù)據(jù)庫記載,找出使用者輸入的關(guān)鍵字檔名。
- find
| [root@www ~]# find [PATH] [option] [action] 選項(xiàng)與參數(shù): 1. 與時(shí)間有關(guān)的選項(xiàng):共有 -atime, -ctime 與 -mtime ,以 -mtime 說明-mtime n :n 為數(shù)字,意義為在 n 天之前的『一天之內(nèi)』被更動(dòng)過內(nèi)容的文件;-mtime +n :列出在 n 天之前(不含 n 天本身)被更動(dòng)過內(nèi)容的文件檔名;-mtime -n :列出在 n 天之內(nèi)(含 n 天本身)被更動(dòng)過內(nèi)容的文件檔名。-newer file :file 為一個(gè)存在的文件,列出比 file 還要新的文件檔名范例一:將過去系統(tǒng)上面 24 小時(shí)內(nèi)有更動(dòng)過內(nèi)容 (mtime) 的文件列出 [root@www ~]# find / -mtime 0 # 那個(gè) 0 是重點(diǎn)!0 代表目前的時(shí)間,所以,從現(xiàn)在開始到 24 小時(shí)前, # 有變動(dòng)過內(nèi)容的文件都會(huì)被列出來!那如果是三天前的 24 小時(shí)內(nèi)? # find / -mtime 3 有變動(dòng)過的文件都被列出的意思!范例二:尋找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出 [root@www ~]# find /etc -newer /etc/passwd # -newer 用在分辨兩個(gè)文件之間的新舊關(guān)系是很有用的! |
時(shí)間參數(shù)真是挺有意思的!我們現(xiàn)在知道 atime, ctime 與 mtime 的意義,如果你想要找出一天內(nèi)被更動(dòng)過的文件名稱,可以使用上述范例一的作法。但如果我想要找出『4天內(nèi)被更動(dòng)過的文件檔名』呢?那可以使用『find /var -mtime -4 』。那如果是『4天前的那一天』就用『find /var -mtime 4 』。有沒有加上『+, -』差別很大喔!我們可以用簡(jiǎn)單的圖示來說明一下:
圖5.2.1、find 相關(guān)的時(shí)間參數(shù)意義
圖中最右邊為目前的時(shí)間,越往左邊則代表越早之前的時(shí)間軸啦。由圖5.2.1我們可以清楚的知道:
- +4代表大於等於5天前的檔名:ex> find /var -mtime +4
- -4代表小於等於4天內(nèi)的文件檔名:ex> find /var -mtime -4
- 4則是代表4-5那一天的文件檔名:ex> find /var -mtime 4
非常有趣吧!你可以在 /var/ 目錄下搜尋一下,感受一下輸出文件的差異喔!再來看看其他 find 的用法吧!
| 選項(xiàng)與參數(shù): 2. 與使用者或群組名稱有關(guān)的參數(shù):-uid n :n 為數(shù)字,這個(gè)數(shù)字是使用者的帳號(hào) ID,亦即 UID ,這個(gè) UID 是記錄在/etc/passwd 里面與帳號(hào)名稱對(duì)應(yīng)的數(shù)字。這方面我們會(huì)在第四篇介紹。-gid n :n 為數(shù)字,這個(gè)數(shù)字是群組名稱的 ID,亦即 GID,這個(gè) GID 記錄在/etc/group,相關(guān)的介紹我們會(huì)第四篇說明~-user name :name 為使用者帳號(hào)名稱喔!例如 dmtsai -group name:name 為群組名稱喔,例如 users ;-nouser :尋找文件的擁有者不存在 /etc/passwd 的人!-nogroup :尋找文件的擁有群組不存在於 /etc/group 的文件!當(dāng)你自行安裝軟件時(shí),很可能該軟件的屬性當(dāng)中并沒有文件擁有者,這是可能的!在這個(gè)時(shí)候,就可以使用 -nouser 與 -nogroup 搜尋。范例三:搜尋 /home 底下屬於 vbird 的文件 [root@www ~]# find /home -user vbird # 這個(gè)東西也很有用的~當(dāng)我們要找出任何一個(gè)使用者在系統(tǒng)當(dāng)中的所有文件時(shí), # 就可以利用這個(gè)命令將屬於某個(gè)使用者的所有文件都找出來喔!范例四:搜尋系統(tǒng)中不屬於任何人的文件 [root@www ~]# find / -nouser # 透過這個(gè)命令,可以輕易的就找出那些不太正常的文件。 # 如果有找到不屬於系統(tǒng)任何人的文件時(shí),不要太緊張, # 那有時(shí)候是正常的~尤其是你曾經(jīng)以原始碼自行編譯軟件時(shí)。 |
如果你想要找出某個(gè)使用者在系統(tǒng)底下創(chuàng)建了啥咚咚,使用上述的選項(xiàng)與參數(shù),就能夠找出來啦!至於那個(gè) -nouser 或 -nogroup 的選項(xiàng)功能中,除了你自行由網(wǎng)絡(luò)上面下載文件時(shí)會(huì)發(fā)生之外,如果你將系統(tǒng)里面某個(gè)帳號(hào)刪除了,但是該帳號(hào)已經(jīng)在系統(tǒng)內(nèi)創(chuàng)建很多文件時(shí),就可能會(huì)發(fā)生無主孤魂的文件存在!此時(shí)你就得使用這個(gè) -nouser 來找出該類型的文件羅!
| 選項(xiàng)與參數(shù): 3. 與文件權(quán)限及名稱有關(guān)的參數(shù):-name filename:搜尋文件名稱為 filename 的文件;-size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的文件。這個(gè) SIZE 的規(guī)格有:c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB還要大的文件,就是『 -size +50k 』-type TYPE :搜尋文件的類型為 TYPE 的,類型主要有:一般正規(guī)文件 (f),裝置文件 (b, c), 目錄 (d), 連結(jié)檔 (l), socket (s), 及 FIFO (p) 等屬性。-perm mode :搜尋文件權(quán)限『剛好等於』 mode 的文件,這個(gè) mode 為類似 chmod的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 !-perm -mode :搜尋文件權(quán)限『必須要全部囊括 mode 的權(quán)限』的文件,舉例來說,我們要搜尋 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,當(dāng)一個(gè)文件的權(quán)限為 -rwsr-xr-x ,亦即 4755 時(shí),也會(huì)被列出來,因?yàn)?-rwsr-xr-x 的屬性已經(jīng)囊括了 -rwxr--r-- 的屬性了。-perm +mode :搜尋文件權(quán)限『包含任一 mode 的權(quán)限』的文件,舉例來說,我們搜尋-rwxr-xr-x ,亦即 -perm +755 時(shí),但一個(gè)文件屬性為 -rw-------也會(huì)被列出來,因?yàn)樗?-rw.... 的屬性存在!范例五:找出檔名為 passwd 這個(gè)文件 [root@www ~]# find / -name passwd # 利用這個(gè) -name 可以搜尋檔名啊!范例六:找出 /var 目錄下,文件類型為 Socket 的檔名有哪些? [root@www ~]# find /var -type s # 這個(gè) -type 的屬性也很有幫助喔!尤其是要找出那些怪異的文件, # 例如 socket 與 FIFO 文件,可以用 find /var -type p 或 -type s 來找!范例七:搜尋文件當(dāng)中含有 SGID 或 SUID 或 SBIT 的屬性 [root@www ~]# find / -perm +7000 # 所謂的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出, # 所以當(dāng)然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三個(gè)權(quán)限, # 因此,就是 +7000 ~了乎? |
上述范例中比較有趣的就屬 -perm 這個(gè)選項(xiàng)啦!他的重點(diǎn)在找出特殊權(quán)限的文件羅!我們知道 SUID 與 SGID 都可以配置在二進(jìn)位程序上,假設(shè)我想要找出來 /bin, /sbin 這兩個(gè)目錄下,只要具有 SUID 或 SGID 就列出來該文件,你可以這樣做:
| [root@www ~]# find /bin /sbin -perm +6000 |
因?yàn)?SUID 是 4 分,SGID 2 分,總共為 6 分,因此可用 +6000 來處理這個(gè)權(quán)限!至於 find 后面可以接多個(gè)目錄來進(jìn)行搜尋!另外, find 本來就會(huì)搜尋次目錄,這個(gè)特色也要特別注意喔!最后,我們?cè)賮砜匆幌?find 還有什么特殊功能吧!
| 選項(xiàng)與參數(shù): 4. 額外可進(jìn)行的動(dòng)作:-exec command :command 為其他命令,-exec 后面可再接額外的命令來處理搜尋到的結(jié)果。-print :將結(jié)果列印到螢?zāi)簧?#xff0c;這個(gè)動(dòng)作是默認(rèn)動(dòng)作!范例八:將上個(gè)范例找到的文件使用 ls -l 列出來~ [root@www ~]# find / -perm +7000 -exec ls -l {} \; # 注意到,那個(gè) -exec 后面的 ls -l 就是額外的命令,命令不支持命令別名, # 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意!范例九:找出系統(tǒng)中,大於 1MB 的文件 [root@www ~]# find / -size +1000k # 雖然在 man page 提到可以使用 M 與 G 分別代表 MB 與 GB, # 不過,俺卻試不出來這個(gè)功能~所以,目前應(yīng)該是僅支持到 c 與 k 吧! |
find 的特殊功能就是能夠進(jìn)行額外的動(dòng)作(action)。我們將范例八的例子以圖解來說明如下:
圖5.2.2、find 相關(guān)的額外動(dòng)作
該范例中特殊的地方有 {} 以及 \; 還有 -exec 這個(gè)關(guān)鍵字,這些東西的意義為:
- {} 代表的是『由 find 找到的內(nèi)容』,如上圖所示,find 的結(jié)果會(huì)被放置到 {} 位置中;
- -exec 一直到 \; 是關(guān)鍵字,代表 find 額外動(dòng)作的開始 (-exec) 到結(jié)束 (\;) ,在這中間的就是 find 命令內(nèi)的額外動(dòng)作。在本例中就是『 ls -l {} 』羅!
- 因?yàn)椤?; 』在 bash 環(huán)境下是有特殊意義的,因此利用反斜線來跳脫。
透過圖 5.2.2 你應(yīng)該就比較容易了解 -exec 到 \; 之間的意義了吧!
如果你要找的文件是具有特殊屬性的,例如 SUID 、文件擁有者、文件大小等等,那么利用 locate 是沒有辦法達(dá)成你的搜尋的!此時(shí) find 就顯的很重要啦!另外,find 還可以利用萬用字節(jié)來找尋檔名呢!舉例來說,你想要找出 /etc 底下檔名包含 httpd 的文件,那么你就可以這樣做:
| [root@www ~]# find /etc -name '*httpd*' |
不但可以指定搜尋的目錄(連同次目錄),并且可以利用額外的選項(xiàng)與參數(shù)來找到最正確的檔名!真是好好用!不過由於 find 在尋找數(shù)據(jù)的時(shí)后相當(dāng)?shù)牟儆脖P!所以沒事情不要使用 find 啦!有更棒的命令可以取代呦!那就是上面提到的whereis 與locate 羅!
極重要!權(quán)限與命令間的關(guān)系:
我們知道權(quán)限對(duì)於使用者帳號(hào)來說是非常重要的,因?yàn)樗梢韵拗剖褂谜吣懿荒茏x取/創(chuàng)建/刪除/修改文件或目錄!在這一章我們介紹了很多文件系統(tǒng)的管理命令,第六章則介紹了很多文件權(quán)限的意義。在這個(gè)小節(jié)當(dāng)中,我們就將這兩者結(jié)合起來,說明一下什么命令在什么樣的權(quán)限下才能夠運(yùn)行吧!^_^
一、讓使用者能進(jìn)入某目錄成為『可工作目錄』的基本權(quán)限為何:
- 可使用的命令:例如 cd 等變換工作目錄的命令;
- 目錄所需權(quán)限:使用者對(duì)這個(gè)目錄至少需要具有 x 的權(quán)限
- 額外需求:如果使用者想要在這個(gè)目錄內(nèi)利用 ls 查閱檔名,則使用者對(duì)此目錄還需要 r 的權(quán)限。
二、使用者在某個(gè)目錄內(nèi)讀取一個(gè)文件的基本權(quán)限為何?
- 可使用的命令:例如本章談到的 cat, more, less等等
- 目錄所需權(quán)限:使用者對(duì)這個(gè)目錄至少需要具有 x 權(quán)限;
- 文件所需權(quán)限:使用者對(duì)文件至少需要具有 r 的權(quán)限才行!
三、讓使用者可以修改一個(gè)文件的基本權(quán)限為何?
- 可使用的命令:例如 nano 或未來要介紹的 vi 編輯器等;
- 目錄所需權(quán)限:使用者在該文件所在的目錄至少要有 x 權(quán)限;
- 文件所需權(quán)限:使用者對(duì)該文件至少要有 r, w 權(quán)限
四、讓一個(gè)使用者可以創(chuàng)建一個(gè)文件的基本權(quán)限為何?
- 目錄所需權(quán)限:使用者在該目錄要具有 w,x 的權(quán)限,重點(diǎn)在 w 啦!
五、讓使用者進(jìn)入某目錄并運(yùn)行該目錄下的某個(gè)命令之基本權(quán)限為何?
- 目錄所需權(quán)限:使用者在該目錄至少要有 x 的權(quán)限;
- 文件所需權(quán)限:使用者在該文件至少需要有 x 的權(quán)限
例題: 讓一個(gè)使用者 vbird 能夠進(jìn)行『cp /dir1/file1 /dir2』的命令時(shí),請(qǐng)說明 dir1, file1, dir2 的最小所需權(quán)限為何? 答: 運(yùn)行 cp 時(shí), vbird 要『能夠讀取來源檔,并且寫入目標(biāo)檔!』所以應(yīng)參考上述第二點(diǎn)與第四點(diǎn)的說明!因此各文件/目錄的最小權(quán)限應(yīng)該是:
|
| 例題: 有一個(gè)文件全名為 /home/student/www/index.html ,各相關(guān)文件/目錄的權(quán)限如下: drwxr-xr-x 23 root root 4096 Sep 22 12:09 /
drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home
drwx------ 6 student student 4096 Sep 29 02:23 /home/student
drwxr-xr-x 6 student student 4096 Sep 29 02:24 /home/student/www
-rwxr--r-- 6 student student 369 Sep 29 02:27 /home/student/www/index.html 請(qǐng)問 vbird 這個(gè)帳號(hào)(不屬於student群組)能否讀取 index.html 這個(gè)文件呢? 答: 雖然 www 與 index.html 是可以讓 vbird 讀取的權(quán)限,但是因?yàn)槟夸浗Y(jié)構(gòu)是由根目錄一層一層讀取的,因此 vbird 可進(jìn)入 /home 但是卻不可進(jìn)入 /home/student/ ,既然連進(jìn)入 /home/student 都不許了,當(dāng)然就讀不到 index.html 了!所以答案是『vbird不會(huì)讀取到 index.html 的內(nèi)容』喔! 那要如何修改權(quán)限呢?其實(shí)只要將 /home/student 的權(quán)限修改為最小 711 ,或者直接給予 755 就可以羅!這可是很重要的概念喔! |
重點(diǎn)回顧
- 絕對(duì)路徑:『一定由根目錄 / 寫起』;相對(duì)路徑:『不是由 / 寫起』
- 特殊目錄有:., .., -, ~, ~account需要注意;
- 與目錄相關(guān)的命令有:cd, mkdir, rmdir, pwd 等重要命令;
- rmdir 僅能刪除空目錄,要?jiǎng)h除非空目錄需使用『 rm -r 』命令;
- 使用者能使用的命令是依據(jù) PATH 變量所規(guī)定的目錄去搜尋的;
- 不同的身份(root 與一般用戶)系統(tǒng)默認(rèn)的 PATH 并不相同。差異較大的地方在於 /sbin, /usr/sbin ;
- ls 可以檢視文件的屬性,尤其 -d, -a, -l 等選項(xiàng)特別重要!
- 文件的復(fù)制、刪除、移動(dòng)可以分別使用:cp, rm , mv等命令來操作;
- 檢查文件的內(nèi)容(讀檔)可使用的命令包括有:cat, tac, nl, more, less, head, tail, od 等
- cat -n 與 nl 均可顯示行號(hào),但默認(rèn)的情況下,空白行會(huì)不會(huì)編號(hào)并不相同;
- touch 的目的在修改文件的時(shí)間參數(shù),但亦可用來創(chuàng)建空文件;
- 一個(gè)文件記錄的時(shí)間參數(shù)有三種,分別是 access time(atime), status time (ctime), modification time(mtime),ls 默認(rèn)顯示的是 mtime。
- 除了傳統(tǒng)的rwx權(quán)限之外,在Ext2/Ext3文件系統(tǒng)中,還可以使用chattr與lsattr配置及觀察隱藏屬性。常見的包括只能新增數(shù)據(jù)的 +a 與完全不能更動(dòng)文件的 +i 屬性。
- 新建文件/目錄時(shí),新文件的默認(rèn)權(quán)限使用 umask 來規(guī)范。默認(rèn)目錄完全權(quán)限為drwxrwxrwx,文件則為-rw-rw-rw-。
- 文件具有SUID的特殊權(quán)限時(shí),代表當(dāng)使用者運(yùn)行此一binary程序時(shí),在運(yùn)行過程中使用者會(huì)暫時(shí)具有程序擁有者的權(quán)限
- 目錄具有SGID的特殊權(quán)限時(shí),代表使用者在這個(gè)目錄底下新建的文件之群組都會(huì)與該目錄的群組名稱相同。
- 目錄具有SBIT的特殊權(quán)限時(shí),代表在該目錄下使用者創(chuàng)建的文件只有自己與root能夠刪除!
- 觀察文件的類型可以使用 file 命令來觀察;
- 搜尋命令的完整檔名可用 which 或 type ,這兩個(gè)命令都是透過 PATH 變量來搜尋檔名;
- 搜尋文件的完整檔名可以使用 whereis 或 locate 到數(shù)據(jù)庫文件去搜尋,而不實(shí)際搜尋文件系統(tǒng);
- 利用 find 可以加入許多選項(xiàng)來直接查詢文件系統(tǒng),以獲得自己想要知道的檔名。
本章習(xí)題:
( 要看答案請(qǐng)將鼠標(biāo)移動(dòng)到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
情境模擬題一:假設(shè)系統(tǒng)中有兩個(gè)帳號(hào),分別是 alex 與 arod ,這兩個(gè)人除了自己群組之外還共同支持一個(gè)名為 project 的群組。假設(shè)這兩個(gè)用戶需要共同擁有 /srv/ahome/ 目錄的開發(fā)權(quán),且該目錄不許其他人進(jìn)入查閱。請(qǐng)問該目錄的權(quán)限配置應(yīng)為何?請(qǐng)先以傳統(tǒng)權(quán)限說明,再以 SGID 的功能解析。
- 目標(biāo):了解到為何專案開發(fā)時(shí),目錄最好需要配置 SGID 的權(quán)限!
- 前提:多個(gè)帳號(hào)支持同一群組,且共同擁有目錄的使用權(quán)!
- 需求:需要使用 root 的身份來進(jìn)行 chmod, chgrp 等幫用戶配置好他們的開發(fā)環(huán)境才行!這也是管理員的重要任務(wù)之一!
| [root@www ~]# groupadd project <==添加新的群組 [root@www ~]# useradd -G project alex <==創(chuàng)建 alex 帳號(hào),且支持 project [root@www ~]# useradd -G project arod <==創(chuàng)建 arod 帳號(hào),且支持 project [root@www ~]# id alex <==查閱 alex 帳號(hào)的屬性 uid=501(alex) gid=502(alex) groups=502(alex),501(project) <==確實(shí)有支持! [root@www ~]# id arod uid=502(arod) gid=503(arod) groups=503(arod),501(project) |
| [root@www ~]# mkdir /srv/ahome [root@www ~]# ll -d /srv/ahome drwxr-xr-x 2 root root 4096 Sep 29 22:36 /srv/ahome |
| [root@www ~]# chgrp project /srv/ahome [root@www ~]# chmod 770 /srv/ahome [root@www ~]# ll -d /srv/ahome drwxrwx--- 2 root project 4096 Sep 29 22:36 /srv/ahome # 從上面的權(quán)限結(jié)果來看,由於 alex/arod 均支持 project,因此似乎沒問題了! |
| [root@www ~]# su - alex <==先切換身份成為 alex 來處理 [alex@www ~]$ cd /srv/ahome <==切換到群組的工作目錄去 [alex@www ahome]$ touch abcd <==創(chuàng)建一個(gè)空的文件出來! [alex@www ahome]$ exit <==離開 alex 的身份[root@www ~]# su - arod [arod@www ~]$ cd /srv/ahome [arod@www ahome]$ ll abcd -rw-rw-r-- 1 alex alex 0 Sep 29 22:46 abcd # 仔細(xì)看一下上面的文件,由於群組是 alex ,arod并不支持! # 因此對(duì)於 abcd 這個(gè)文件來說, arod 應(yīng)該只是其他人,只有 r 的權(quán)限而已啊! [arod@www ahome]$ exit |
| [root@www ~]# chmod 2770 /srv/ahome [root@www ~]# ll -d /srv/ahome drwxrws--- 2 root project 4096 Sep 29 22:46 /srv/ahome測(cè)試:使用 alex 去創(chuàng)建一個(gè)文件,并且查閱文件權(quán)限看看: [root@www ~]# su - alex [alex@www ~]$ cd /srv/ahome [alex@www ahome]$ touch 1234 [alex@www ahome]$ ll 1234 -rw-rw-r-- 1 alex project 0 Sep 29 22:53 1234 # 沒錯(cuò)!這才是我們要的樣子!現(xiàn)在 alex, arod 創(chuàng)建的新文件所屬群組都是 project, # 由於兩人均屬於此群組,加上 umask 都是 002,這樣兩人才可以互相修改對(duì)方的文件! |
簡(jiǎn)答題部分:
- 什么是絕對(duì)路徑與相對(duì)路徑 絕對(duì)路徑的寫法為由 / 開始寫,至於相對(duì)路徑則不由 / 開始寫!此外,相對(duì)路徑為相對(duì)於目前工作目錄的路徑!
- 如何更改一個(gè)目錄的名稱?例如由 /home/test 變?yōu)?/home/test2 mv /home/test /home/test2
- PATH 這個(gè)環(huán)境變量的意義? 這個(gè)是用來指定運(yùn)行檔運(yùn)行的時(shí)候,命令搜尋的目錄路徑。
- umask 有什么用處與優(yōu)點(diǎn)? umask 可以拿掉一些權(quán)限,因此,適當(dāng)?shù)亩x umask 有助於系統(tǒng)的安全,因?yàn)樗梢杂脕韯?chuàng)建默認(rèn)的目錄或文件的權(quán)限。
- 當(dāng)一個(gè)使用者的 umask 分別為 033 與 044 他所創(chuàng)建的文件與目錄的權(quán)限為何? 在 umask 為 033 時(shí),則默認(rèn)是拿掉 group 與 other 的 w(2)x(1) 權(quán)限,因此權(quán)限就成為『文件 -rw-r--r-- , 目錄 drwxr--r-- 』而當(dāng)umask 044 時(shí),則拿掉 r 的屬性,因此就成為『文件 -rw--w--w-,目錄 drwx-wx-wx』
- 什么是 SUID ? 當(dāng)一個(gè)命令具有 SUID 的功能時(shí),則:
- SUID 權(quán)限僅對(duì)二進(jìn)位程序(binary program)有效;
- 運(yùn)行者對(duì)於該程序需要具有 x 的可運(yùn)行權(quán)限;
- 本權(quán)限僅在運(yùn)行該程序的過程中有效 (run-time);
- 運(yùn)行者將具有該程序擁有者 (owner) 的權(quán)限。
- 當(dāng)我要查詢 /usr/bin/passwd 這個(gè)文件的一些屬性時(shí)(1)傳統(tǒng)權(quán)限;(2)文件類型與(3)文件的隱藏屬性,可以使用什么命令來查詢? ls -al
file
lsattr - 嘗試用 find 找出目前 linux 系統(tǒng)中,所有具有 SUID 的文件有哪些? find / -perm +4000 -print
- 找出 /etc 底下,文件大小介於 50K 到 60K 之間的文件,并且將權(quán)限完整的列出 (ls -l): find /etc -size +50k -a -size -60k -exec ls -l {} \;
注意到 -a ,那個(gè) -a 是 and 的意思,為符合兩者才算成功 - 找出 /etc 底下,文件容量大於 50K 且文件所屬人不是 root 的檔名,且將權(quán)限完整的列出 (ls -l); find /etc -size +50k -a ! -user root -exec ls -ld {} \;
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
上面兩式均可!注意到 ! ,那個(gè) ! 代表的是反向選擇,亦即『不是后面的項(xiàng)目』之意! - 找出 /etc 底下,容量大於 1500K 以及容量等於 0 的文件: find /etc -size +1500k -o -size 0
相對(duì)於 -a ,那個(gè) -o 就是或 (or) 的意思羅!
參考數(shù)據(jù)與延伸閱讀
- 小洲大大回答 SUID/SGID 的一篇討論:
http://phorum.vbird.org/viewtopic.php?t=20256
2002/06/26:第一次完成2003/02/06:重新編排與加入 FAQ
2003/02/07:加入 basename 與 dirname 的說明
2004/03/15:將連結(jié)檔的內(nèi)容移動(dòng)至下一章節(jié):Linux 磁碟與硬件管理
2005/07/19:將舊的文章移動(dòng)到 這里 了。
2005/07/20:呼呼!好不容易啊~在被臺(tái)風(fēng)尾掃到的七月份,終於寫完這個(gè)咚咚~
2005/07/21:在 find 部分,多添加了范例九,以及關(guān)於利用文件大小 (size) 搜尋的功能。
2005/07/25:在 SUID/SGID/SBIT 部分,依據(jù) netman 與 小州 兄的建議,修改了部分的敘述!
2006/04/09:在 rmdir 的范例內(nèi),少了一個(gè) -p 的參數(shù)!
2006/06/15:經(jīng)由討論局域網(wǎng)友 dm421 的通知,發(fā)現(xiàn) chattr 的部分關(guān)於 d 寫錯(cuò)了,已訂正。
2006/08/22:添加 rm 的一些簡(jiǎn)單的說明!尤其是『 rm ./-aaa- 』的刪除方法!
2008/09/23:將針對(duì)FC4版寫的數(shù)據(jù)移到此處
2008/09/29:加入權(quán)限與命令的關(guān)系一節(jié),并新增情境模擬題目喔!大家?guī)兔Τe(cuò)一下!
2009/08/18:加入符號(hào)法的方式來處理 SUID/SGID/SBIT 羅!
2009/08/26:感謝網(wǎng)友告知習(xí)題部分,找出 /etc 底下容量大於 50k 的那題,應(yīng)使用 -type f 或 ls -ld 來避免目錄內(nèi)重復(fù)顯示!
出處:http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php
總結(jié)
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(基础篇)- 第七章、Linux 文件与目录管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的Linux私房菜(基础篇)- 第六
- 下一篇: linux 其他常用命令