Linux 基礎學習篇 - Mandrake 9

第六章、Linux 檔案與目錄管理 - for Mandrake 9

鳥哥的第一本書籍的主要內容,內容稍微與書籍不太一樣了!

最近更新時間: 2004/03/15

鳥哥的第一本書大約是在 2002 年的年底左右出版的,內容幾乎都是 Linux 基礎學習,一點也沒有談到伺服器的部份!這也是後來的雛型! 不過內容錯誤的地方很多,導致在 2003 年的年底推出了『基礎學習篇增訂版』的內容,大致上就是處理掉一些比較有嚴重錯誤的部份。 不過,因為 Linux 的版本變化非常快速,因此,寫完了這些文件之後,鳥哥還是持續在網站上更新文件內容,導致原本書籍內容的資料與網站資料差異太大! 這個問題直到鳥哥在 2008 年左右才發現!糟糕了!舊版的文件資料已經遺失~覺得相當扼腕~

因此,在底下的文件內容與當初的書籍內容雖然大同小異,不過章節的編排卻是有所不同!再花時間去一個一個處理,似乎也不太符合成本效益! 鳥哥僅是想要將自己以前的文件記錄下來而已,同時將過時的 big5 編碼改回 utf8 編碼,再加上可以支援 RWD 的樣式而已啦! 內容已經不多做編排~因此,如果內容文件你看不懂,那也是應該的! ^_^

建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。最新文章請前往鳥站首頁查閱囉!

目錄與路徑:

由前一章節『Linux 的檔案權限與目錄配置』中約略瞭解到 Linux 的『樹狀目錄』概念之後,接下來就得要實際的來搞定一些基本的路徑問題了!這些問題當中,最重要的莫過於『絕對路徑』與『相對路徑』的意義啦!趕緊來瞭解一下!

  • 絕對路徑與相對路徑:

  • 在開始目錄的切換之前,你必須要先瞭解一下所謂的『路徑, PATH』,有趣的是:什麼是『相對路徑』與『絕對路徑』?如果你還記得前一章的內容的話,那麼應該還記得 Linux 裡面的目錄是呈現『樹狀目錄』的情況,有就是有分支的啦!好了,假設你需要在任意一個目錄下變換到根目錄的 etc 底下,那麼你就應該要使用『 cd /etc 』這個情況,這也就是所謂的『絕對路徑』,他是從根目錄連續寫上來的一個情況,所以不論你在哪一個路徑現執行這一個指令,都會將你移動到該路徑下。那如果我是使用『 cd etc 』呢?那表示你要切換到『目前這個目錄下的 etc 目錄中』,情況可是不一樣的呦!通常第一次接觸 Linux 的使用者常會搞錯這一個路徑的觀念!
     
    • 絕對路徑:路徑的寫法『一定由根目錄 / 寫起』,例如: /usr/share/doc 這個目錄。
    • 相對路徑:路徑的寫法『不是由 / 寫起』,例如由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成: 『cd ../man』這就是相對路徑的寫法啦!
     
    那麼相對路徑與絕對路徑有什麼了不起呀!?喝!那可真的是了不起了!假設您寫了一個套件,這個套件共需要三個目錄,分別是 etc, bin, man 這三個目錄,然而由於不同的人喜歡安裝在不同的目錄之下,假設甲安裝的目錄是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man ,不過乙卻喜歡安裝在 /home/packages/etc, /home/packages/bin, /home/packages/man 這三個目錄中,請問如果需要用到絕對路徑的話,那麼是否很麻煩呢?是的!如此一來每個目錄下的東西就很難對應的起來!這個時候相對路徑的寫法就顯的特別的重要了!
     
    此外,如果您跟我一樣,喜歡將路徑的名字寫的很長,好讓自己知道那個目錄是在幹什麼的,例如:/data4/staiwan19961109/models-3/smoke 這個目錄,而另一個目錄在 /data4/staiwan19961109/models-3/cctm ,那麼我從第一個要到第二個目錄去的話,怎麼寫比較方便?當然是『 cd ../cctm 』比較方便囉!對吧!
     
    好了,既然要談到目錄這個東西,自然就需要瞭解一下有哪些常用的目錄『符號』代表的意義啦!
     
    .     代表此層目錄
    ..    代表上層目錄
    ~     代表自己的家目錄
    ~user 代表到 user 這個人的家目錄
     
    底下我們要來談一談目錄與路徑的幾個常用的指令:
    • cd     變換目錄
    • pwd    顯示目前的目錄
    • mkdir 建立一個新目錄
    • rmdir 刪除一個裡面是空的空目錄
     

  • cd 與 pwd

  • 這兩個指令主要是在『變換目前目錄』與『顯示目前所在目錄』的工作,底下說一說他們的用途與語法吧!
     
  • cd

  • 語法
    [root @test /root ]# cd [相對路徑或絕對路徑] 
    參數說明:
    路徑有『相對路徑』與『絕對路徑』的分別,請千萬小心囉!
    範例:
    [root @test /root]# cd ..       <==回到上一層目錄
    [root @test /root]# cd ../home     <==相對路徑的寫法
    [root @test /root]# cd /var/www/html  <==絕對路徑的寫法
    [root @test /etc]# cd         <==回到使用者的家目錄
    [root @test /etc]# cd ~         <==回到使用者的家目錄!
    [root @test /etc]# cd ~test      <==回到 test 這個使用者的家目錄
    說明
    cd 是 change directory 的縮寫,這是用來變換工作路徑的指令。注意,路徑與 cd 指令之間存在一個空格!一登入 Linux 系統後,root 會在 root 的家目錄,亦即 /root 下,至於使用者會在預設的 /home/username 底下,例如鳥哥的 ID 為 vbird ,則以 vbird 的身份登入後,會到 /home/vbird 這個路徑下。OK!那回到上一層可以用『 cd .. 』而到相對路徑可到『 cd ../bird』,至於絕對路徑則是 cd /usr/sbin !注意喔,在前面的提示字元會改變路徑名稱!此外,家目錄還有一個代碼,那就是『 ~ 』符號!例如上面的例子可以發現,使用『 cd ~ 』可以回到個人的家目錄裡頭去呢! 此外,如果你的 Linux 主機當中有個 testing 的帳號,你要到他的家目錄去,可以下達『 cd ~testing』立刻去到 testing 的家目錄囉!
     

  • pwd

  • 語法
    [root @test /root ]# pwd 
    範例:
    [root @test root]# cd /home/test
    [root @test test]# pwd 
    /home/test             <==顯示目前你所在的目錄呦!
    說明
    pwd 是 print working directory 的縮寫,也就是顯示目前所在目錄的指令,例如在上個表格最後的目錄是 /home/test 這個目錄,但是提示字元僅顯示 test ,如果你想要知道目前所在的目錄,可以輸入 pwd 即可:
     
    此外,由於很多的套件所使用的目錄名稱都相同,例如 /usr/local/etc 還有 /etc ,但是通常 Linux 僅列出最後面那一個目錄而已,這個時候你就可以使用 pwd 來知道你的所在目錄囉!免得搞錯目錄,結果……
     

  • mkdir 與 rmdir 管理目錄:

  • 那麼要如何建立刪除目錄呢?很簡單呀!就用 mkdir 與 rmdir ,看出來了嗎?沒錯啦!就是 make/remove directory 的縮寫說!看要怎麼用吧!
     
  • mkdir

  • 語法
    [root @test /root ]# mkdir [-mp] [目錄名稱]
    參數說明:
    -m :設定檔案的權限喔!直接設定,不需要看 umask 這個內容的臉色!
    -p :幫助你直接將上面的目錄遞迴建立起來!
    範例:
    [root @test /root]# cd tmp
    [root @test /tmp]# mkdir test<==建立名稱為 test 的目錄
    [root @test /tmp]# mkdir -p test1/test2/test3/test4 <==直接建立 test2...等上層目錄
    [root @test /tmp]# mkdir -m 711 testqq  <==建立權限為 711 的目錄!
    [root @test /tmp]# ll test*
    drwxrwxr-x    2 test    test        4096 Feb  6 20:47 test/
    drwxrwxr-x    3 test    test        4096 Feb  6 20:48 test1/
    drwx--x--x    2 test    test        4096 Feb  6 20:48 testqq/
    說明
    如果想要建立新的目錄的話,那麼就使用 mkdir 吧! 不過,請注意呦!在預設的情況下,你所需要的目錄得一層一層的建立才行!例如:假如你要建立一個目錄為 /home/bird/testing/test1,那麼首先必須要有 /home 然後 /home/bird ,再來 /home/bird/testing 都必須要存在,才可以建立 test1 這個目錄!假如沒有 /home/bird/testing 時,就沒有辦法建立 test1 的目錄囉!不過,現在有個更簡單有效的方法啦!那就是加上 -p 這個參數喔!你可以直接下達:『 mkdir -p /home/bird/testing』則系統會自動的幫你將 /home, /home/bird, /home/bird/testing 依序的建立起目錄!並且,如果該目錄本來就已經存在時,系統也不會顯示錯誤訊息喔!挺快樂的吧! ^_^
     

  • rmdir

  • 語法
    [root @test /root ]# rmdir [-p] [目錄名稱]
    參數說明:
    -p :將上層的目錄也刪除吧!
    範例:
    [root @test /root]# rmdir test<==刪除名稱為 test 的目錄
    [root @test tmp]# ll
    drwxrwxr-x    3 test    test        4096 Feb  6 20:48 test1/
    [root @test tmp]# rmdir test1
    rmdir: `test1': Directory not empty
    [root @test tmp]# rmdir -p test1/test2/test3/test4
    [root @test tmp]$ ll
    說明
    如果想要建立刪除舊有的目錄時,就使用 rmdir 吧!例如將剛剛建立的 test 殺掉,使用 rmdir test 即可!請注意呦!目錄需要一層一層的刪除才行!而且被刪除的目錄裡面必定不能還有其他的目錄或檔案!那如果要將所有目錄下的東西都殺掉呢?!這個時候就必須使用 rm -rf test 囉!不過,還是使用 rmdir 比較不危險!不過,你也可以嘗試以 -p 的參數加入,來刪除上層的目錄喔!
     

  • 環境變數 PATH

  • 在提過了絕對路徑、相對路徑與指令的下達方式之後,您應該會稍微注意到一件事情,那就是:『為什麼我可以在 /root 底下執行 /bin/ls 這個檔案呢?』對呀!為什麼我可以直接執行 ls 就一定可以顯示出一些訊息而不會說找不到該檔案呢?這是因為環境變數 PATH 的幫助所致呀!當我們在執行一個指令的時候,系統會依照 PATH 的設定去每個 PATH 定義的路徑下搜尋檔案,先搜尋到的指令檔案先被執行之!現在,請下達 echo $PATH , echo 有『顯示、印出』的意思,而 PATH 前面加的 $ 表示後面接的是變數,所以即會顯示出目前的 PATH 了!
     
    [root@test root]# echo $PATH
    /sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
     
    注意到了嗎?對啦! /bin 在 PATH 的設定之中,所以自然就可以找的到 ls 啦!
     
    • 如果你將 ls 移動到 /root 底下的話,然後你自己本身也在 /root 底下,但是當你執行 ls 的時候,他就是不理你?怎麼辦?這是因為 PATH 沒有 /root 這個目錄,而你又將 ls 移動到 /root 底下了,自然系統就找不到可執行檔了,因此就會告訴你, command not found !那麼該怎麼克服這種問題呢?有兩個方法,其一:直接將 /root 的路徑加入 PATH 當中!如何增加?可以使用:

    •  
        PATH=”$PATH”:/root
       
      這種方式來增加即可!另一種方式則是使用完整檔名,亦即直接使用相對或絕對路徑來執行,例如:
       
          /root/ls
          ./ls
         
      因為在同一個目錄中,而我們又知道在同一個目錄中的目錄符號為『 . 』,因此,就以上面的 ./ls 來執行也可以!這種執行方式以後您應該會很常見到才對!
     
    • 如果我有兩個 ls 檔案在不同的目錄中,例如 /usr/local/bin/ls 底下與 /bin/ls 那麼當我下達 ls 的時候,那個 ls 會被執行?那還用說,就找出 PATH 裡面那個目錄先被查詢,則那個目錄下的檔案就會被先執行了!
     
    • 咦!既然如此的話,那麼為何不要在 PATH 裡面加入 . 這個目錄,如此一來的話,不就可以直接在所在目錄執行檔案了嗎?因為 . 代表所在目錄嘛!是這樣沒錯!但是有沒有想過,如果某天,某個怪怪的使用者在 /tmp 裡面寫了一個 ls 的檔案,偏偏他是有害的檔案,那麼當你在 /tmp 底下執行 ls 時,怎麼辦?!沒錯,可能會『中標』,所以囉,為了安全起見,不建議將『 . 』加入 PATH 的搜尋當中

檔案與目錄管理:

談了談目錄與路徑之後,再來討論一下關於檔案的一些基本管理吧!檔案與目錄的管理上,不外乎『顯示屬性』、『拷貝』、『刪除檔案』及『移動檔案或目錄』等等,由於檔案與目錄的管理在 Linux 當中是很重要的!尤其是每個人自己家目錄的資料也都需要注意管理!由於我們在執行程式的時後,系統預設有一個搜尋的路徑順序,如果有兩個以上相同檔名的執行檔分別在不同的路徑時,呵呵,就需要特別留意囉!這裡我們來談一談有關檔案與目錄的一些基礎管理部分吧!
ls 顯示檔案名稱、屬性等
cp 拷貝檔案或目錄
rm 刪除檔案或目錄
mv 移動檔案或目錄
 

  • ls

  • 語法
    [root @test /root ]# ls [-ailS]
    參數說明:
    -a       :全部的檔案都列出(連同隱藏檔)
    -i       :印出 inode 的值
    -l       :長的列出,連同檔案大小的資料等等
    -S       :以檔案大小排序
    --color=never     :不要顯示顏色
    --color=always    :均顯示顏色
    --color=auto      :由系統自行判斷!
    範例:
    [root @test /root]# ls -al
    total 48
    drwxr-x---    4 root     root         4096 Mar 10 00:37 .
    drwxr-xr-x   21 root     root         4096 Mar 10 20:16 ..
    -rw-------    1 root     root          524 Mar 10 00:40 .bash_history
    -rw-r--r--    1 root     root           24 Jun 11  2000 .bash_logout
    -rw-r--r--    1 root     root          266 Jun 11  2000 .bash_profile
    -rw-r--r--    1 root     root          249 Mar  6 20:50 .bashrc
    -rw-r--r--    1 root     root          210 Jun 11  2000 .cshrc
    drwx------    2 root     root         4096 Mar  9 11:06 .gnupg
    -rw-------    1 root     root          524 Jan 16 14:37 .mysql_history
    drwx------    2 root     root         4096 Mar  9 11:06 .ssh
    -rw-r--r--    1 root     root          196 Jul 11  2000 .tcshrc
    -rw-r--r--    1 root     root         1126 Aug 24  1995 .Xresources
    [root @test /]# ls
    bin   dev    etc   lib         misc  opt   root  tftpboot  usr
    boot  disk1  home  lost+found  mnt   proc  sbin  tmp       var
    [root @test /]# ls --color=never
    bin   dev    etc   lib         misc  opt   root  tftpboot  usr
    boot  disk1  home  lost+found  mnt   proc  sbin  tmp       var
    [root @test /]# ls -al|more
    說明
    還記得我們在解釋檔案的一些屬性與目錄的結構的那一章嗎?!對啦!我們使用的第一支指令就是 ls 啦!通常我們都需要知道這個檔案名稱『目錄』還是『檔案』?所以,我都喜歡使用『 ll』這個指令,其實那就是ls -l 的意思啦!不論如何,你都可以嘗試著執行這之指令來視察你的檔案!
     
    請注意呦!不要忘記你的資料的主要咚咚!尤其是前面幾個主要的屬性呦!另外,你有沒有發現如果在遠端以 telnet 或者是 putty 的連線程式登入主機的時後,由於 Linux 預設使用有顏色的方式顯示方式,但是像上表一樣,藍色的字樣根本就是很難看到!這個時候通常我都是使用『ls --color=never 』來丟掉顏色!那如果想讓 ls 預設沒有顏色的話,可以在 /root/.bashrc 或者是你的家目錄的 .bashrc 這個檔案中加入下面這一行:
    alias ls='ls --color=never'
    這樣就可以把顏色去到了!至於 alias 是在幹嘛的?我們到了 bash 這個 shell 的時候再來談吧!
     

  • cp

  • 語法
    [root @test /root ]# cp [-drsu] [來源檔] [目的檔]
    參數說明:
    -d     :在進行 copy 的時候,如果是 copy 到 link 檔案,若不加任何參數,則預設情況中會將 link 到的原始檔案
           copy 到目的地,若加 -d 時,則 link 檔案可原封不動的將 link 這個捷徑其拷貝到目的地!
    -r     :可以進行目錄的 copy 呦!
    -s          :做成連結檔,而不 copy 之意!與 ln 指令相同功能!
    -u, --update:如果來源檔比較新,或者是沒有目的檔,那麼才會進行 copy 的動作!可用於備份的動作中!
    範例:
    [root @test /root]# cp    .bashrc bashrc      <==將 .bashrc 拷貝成 bashrc 這個檔案!
    [root @test /root]# cp -r /bin /tmp/bin        <==這個功能就好玩啦!這是用來 copy 整個目錄的參數!
    [root @test /root]# cp -s .bashrc bashrc         <==將 .bashrc 建立一個連結檔,檔名為 bashrc
    [root @test /root]# cp -u /home/.bashrc .bashrc  <==先檢查 /home/.bashrc 是否與 .bashrc 不同,如果不同的話就開始 copy 一份!如果相同則不做任何動作!
    說明
    這個指令會常用到的呦!因為我們得常常需要 copy 資料呀!所以需要瞭解一下喔!如果你有些很大檔案的需要備份,偏偏這個檔案的更新率很低,那麼每次備份都需要在 copy 一份嗎?看來是不需要了!你可以使用『cp -u 來源檔 目的檔』來備份呦!如此一來,當檔案被改變過後,才會進行 copy 的動作!
     

  • rm

  • 語法
    [root @test /root ]# rm [-fir] [檔名]
    參數說明:
    -i     :提供使用者確認(這是預設值)
    -r     :循環,就是一直殺掉,直到沒有東西為止的意思
    -f     :force ,就是強力殺掉啦!
    範例:
    [root @test /root]# cp .bashrc bashrc<==建立一個新檔案, bashrc
    [root @test /root]# rm bashrc           <==會顯示如下的提示:
    rm: remove `bashrc'?
    [root @test /root]# mkdir testing
    [root @test /root]# cp .bashrc testing
    [root @test /root]# rmdir testing
    rmdir: `testing': Directory not empty   <==由於 testing 裡面有 .bashrc ,所以砍不掉!
    [root @test /root]# rm -rf testing      <==持續刪除該目錄下的所有檔案與目錄
    說明
    這是移除的指令,相當於 dos 下的 del 指令!這裡要注意的是,通常在 Linux 系統下,為了怕檔案被誤殺,所以都已經有 -i 這個參數, -i 是指每個檔案被殺掉之前都會讓使用者確認一次,以預防誤殺檔案!而如果要連目錄下的東西都一起殺掉的話,例如子目錄裡面還有子目錄時,那就要使用 -rf 這個參數了!不過,使用『 rm -rf 』這個指令之前,請千萬注意了,因為,該目錄或檔案『肯定』會被 root 殺掉!因為系統不會再次詢問你是否要砍掉呦! 所以那是個超級嚴重的指令下達呦!得特別注意!不過,如果你確定該目錄不要了,那麼使用 rm -rf 來循環殺掉是不錯的方式!
     

  • mv

  • 語法
    [root @test /root ]# mv [-u] [來源檔] [目的檔]
    參數說明:
    -u   :同樣的,為 update 的簡寫,當來源檔比目的檔還新的時後才會動作!
    範例:
    [root @test /root]# cp .bashrc bashrc
    [root @test /root]# mv bashrc bashrc.old
    [root @test /root]# mv bashrc bashrc2 /tmp<==將 bashrc 與 bashrc2 移動到 /tmp 這個目錄下!請注意,最後一個才是最終的目標,其他的都是 SOURCE
    說明
    這是搬移的意思!當你要移動檔案或目錄的時後,呵呵!這個指令就很重要啦!同樣的,你也可以使用 -u ( update )來測試新舊檔案,看看是否需要搬移囉!另外一個用途就是『變更檔名!』,我們可以很輕易的使用 mv 來變更一個檔案的檔名呢!
     

  • basename

  • 語法
    [root @test /root ]# basename [目錄]
    參數說明:
    範例:
    [root @test /root]# basename /usr/local/etc
    etc
    這個指令會將後面的[目錄]僅擷取出最後面的那個目錄或檔案,
    以上面的例子來看, /usr/local/etc 不論 etc 是目錄或檔案,
    他都會被擷取出來,因為他是最後一個出現的咚咚!
    說明
    這個指令頗有點意思~他可以將一個目錄或檔案的最後一個咚咚秀出來!所以,未來如果你有要使用變數,並且取出最後一個資料(不論是檔案還是目錄),那麼使用這個玩意兒就對啦! ^_^
     

  • dirname

  • 語法
    [root @test /root ]# dirname [目錄]
    參數說明:
    範例:
    [root @test /root]# dirname /usr/local/etc
    /usr/local
    恰恰與 basename 相反,他僅是秀出來前面的『目錄』部分喔!
    說明
    這個指令恰恰與 basename 相反的啦!呵呵!很好玩吧!這部份也最常用在我們第三部分要講的 Shell 的學習中喔!用最多的地方應該是 scripts 啦!用這兩個寶貝蛋來擷取部分資料的內容!有用的很!

    觀看檔案內容cat, tac, more, less, head, tail, nl,
    剛剛我們提到的都只是在於顯示檔案的外觀,或者是移動與複製一個檔案或目錄而已,那麼如果我們要視察一個檔案的內容時,該如何是好呢?!這裡有相當多有趣的指令可以來分享一下:最常使用的顯示檔案內容的指令可以說是 cat 與 more 及 less 了!此外,如果我們要查看一個很大型的檔案(好幾百MB時),但是我們只需要後端的幾行字而已,那麼該如何是好?呵呵!用 tail 呀,此外, tac 這個指令也可以達到!好了,說說各個指令的用途吧!
    cat  由第一行開始顯示檔案內容
    tac  從最後一行開始顯示,可以看出 tac 是 cat 的倒著寫!
    more 一頁一頁的顯示檔案內容
    less 與 more 類似,但是比 more 更好的是,他可以往前翻頁!
    head 只看頭幾行
    tail 只看尾巴幾行
    nl   顯示的時候,順道輸出 行號!
    od   以二進位的方式讀取檔案內容!
    底下我們來談一談每個指令的基本用法吧!

  • cat

  • 語法
    [root @test /root ]# cat [-nAE]
    參數說明:
    -n:   顯示時,連行號印出螢幕上。
    -A:   將 DOS 下的 <tab> 與斷行字符都列出來!
    -E:   將 DOS 編輯的文件中,僅列出 斷行字符出來!
    範例:
    [root @test /root]# cat ~/.bashrc         <==顯示 .bashrc 這個檔案
    # .bashrc

    # User specific aliases and functions
    PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    alias ll='ls -l --color=never'

    [root @test /root]# cat ~/.bashrc -n      <==顯示 .bashrc 並且加上行號!
         1  # .bashrc
         2
         3  # User specific aliases and functions
         4  PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
         6  alias rm='rm -i'
         7  alias cp='cp -i'
         8  alias mv='mv -i'
         9  alias ll='ls -l --color=never'

    [root @test /root]# cat -A regexp.txt
    This is a cat, however, I need a dog.^M$
    I want to "Happy" and <Happy> and /Happy/ here.^M$
    OK! ^Ieverythins is OK^M$
    Now, I will eat my food^M$
    are you ^Ifinished your work^M$
    what do you 123 goto where^M$
    顯示出 DOS 檔案的幾個特殊符號,以上面檔案為例,
    可發現 ^M 為斷行符號,而每行的 $ 為行尾符號,
    至於 ^I 則是 <tab> 按鍵啦! 

    說明
    嘿嘿! Linux 裡面有『貓』?!喔!不是的, cat 是 Concatenate (連續)的簡寫,主要的功能是將一個檔案的內容連續的印出在螢幕上面!例如上面的例子中,我們將重要的參數檔 .bashrc 印出來!如果加上 -n 的話,則每一行前面還會加上行號呦!cat 比較少用!畢竟當你的檔案內容的行數超過 40 行以上,嘿嘿!根本來不及看!所以,配合 more 或者是 |more 來執行比較好!此外,如果是一般的 DOS 檔案時,就需要特別留意一些奇奇怪怪的符號了,例如斷行與<tab>等,要顯示出來,就得加入 -A 之類的參數了!。
     

  • tac

  • 語法
    [root @test /root ]# tac [檔名]
    參數說明:
    範例:
    [root @test /root]# tac ~/.bashrc <==發現了沒?反向印出呦!
    fi
            . /etc/bashrc
    if [ -f /etc/bashrc ]; then
    # Source global definitions

    alias h='history'
    alias lm='ls -al|more'
    alias ll='ls -l'
    # alias ll='ls -l --color=never'
    alias mv='mv -i'
    alias cp='cp -i'
    alias rm='rm -i'

    export PATH
    PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
    # User specific aliases and functions

    # .bashrc

    說明
    tac 這個好玩了!怎麼說呢?詳細的看一下, cat 與 tac ,有沒有發現呀!對啦! tac 剛好是將 cat 反寫過來,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最後一行連續顯示在螢幕上』,而 tac 則是『由最後一行到第一行反向在螢幕上顯示出來』,很好玩吧!
     

  • more

  • 語法
    [root @test /root ]# more [檔名]
    參數說明:
    範例:
    [root @test /root]# more ~/.bashrc  <==一頁一頁的顯示檔案內容
    [root @test /]# ls -al | more <==一頁一頁的將 ls 的內容顯示出來
    說明
    more 真是個很有用的指令!我好喜歡呦!當你的檔案太大的時後,那麼使用 cat 將沒有辦法看清楚!這個時候你可以使用 more 來做動作!more 也可以用來做為管線的同時執行之用!例如你在執行 find 這個尋找的指令時,可以同時使用 |more ,則搜尋結果可以一頁一頁的列出呦!關於管線( pipe )的用法我們在 bash shell 的地方再來談!
     

  • less

  • 語法
    [root @test /root ]# less [檔名] 
    參數說明: 
    範例: 
    [root @test /root]# less ~/.bashrc 
    說明
    less 的用法比起 more 又更加的有彈性,怎麼說呢?在 more 的時候,我們並沒有辦法向前面翻,只能往後面看,但若使用了 less 時,呵呵!就可以使用 [pageup] [pagedown] 等按鍵的功能來往前往後翻看文件,您瞧,是不是更容易使用來觀看一個檔案的內容了呢!?
     
    more 與 less 的用途與用法真的是很廣啦!首先,你可以在 more 與 less 的畫面中進行『搜尋』的工作!如何進行呢?我們以 less 來說明好了,如果你想要知道 /etc/man.config 這個檔案裡面有沒有一個叫做 GER 的大寫字眼,那麼可以:
     
    [root @test /root ]# less /etc/man.config 
    按鍵說明:
    /word:在 /etc/man.config 這個檔案中搜尋 word 這個字串的所在
    q    :離開 less 的畫面
     
    然後在輸入 / 之後,游標會移動到最左下角等待輸入,這個時候您只要輸入你的字串之後,就會自動的幫你找出來該關鍵字囉!
     

  • head

  • 語法
    [root @test /root ]# head [-n number] [檔名]
    參數說明:
    -n :顯示 number 行
    範例:
    [root @test /root]# head ~/.bashrc  <==預設情況下,顯示頭十行
    [root @test /root]# head -n 20 ~/.bashrc<==顯示頭二十行!
    說明
    head 的英文意思就是『頭』啦,那麼這個東西的用法自然就是顯示出一個檔案的前幾行囉!沒錯!就是這樣!若沒有加上 -n 這個參數時,預設只顯示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
     

  • tail

  • 語法
    [root @test /root ]# tail [-n number] [檔名]
    參數說明:
    -n :顯示 number 行
    範例:
    [root @test /root]# tail ~/.bashrc
    [root @test /root]# tail -n 5 ~/.bashrc <==只顯示最後面五行!
    說明
    那麼有 head 自然就有 tail ( 尾巴 ) 囉!沒錯!這個 tail 的用法跟 head 的用法差不多類似,只是顯示的是後面幾行就是了!預設也是顯示十行,若要顯示非十行,就加 -n number 的參數!
     
    例題一:假如我想要顯示 ~/.bashrc 的第 11 到第 20 行呢?
    答:
    這個應該不算難,想一想,在第 11 到第 20 行,那麼我取前 20 行,再取後十行,所以結果就是:『 head –n 20 ~/.bashrc | tail –n 10 』,這樣就可以得到第 11 到第 20 行之間的內容了!但是裡面涉及到管線命令,需要在第三篇的時候才講的到!
     

  • nl

  • 語法
    [root @test /root ]# nl [檔名]
    參數說明:
    範例:
    [root @test /root]# nl ~/.bashrc
    說明
    那麼 nl 又是什麼?這也沒什麼,這個指令的用法跟 cat -n 的用法類似,也就是『可以印出行號』的指令來查看檔案啦!也是挺好用的!
     

  • od

  • 語法
    [root @test /root ]# od [檔名]
    參數說明:
    範例:
    [root @test /root]# od ~/.bashrc
    0000000 020043 061056 071541 071150 005143 021412 052440 062563
    0000020 020162 070163 061545 063151 061551 060440 064554 071541
    0000040 071545 060440 062156 063040 067165 072143 067551 071556
    0000060 050012 052101 036510 027442 064542 035156 071457 064542
    0000100 035156 072457 071163 071457 064542 035156 072457 071163
    0000120 061057 067151 027472 071565 027562 067554 060543 027554
    0000140 061163 067151 027472 071565 027562 067554 060543 027554
    0000160 064542 035156 050044 052101 021110 062412 070170 071157
    0000200 020164 040520 044124 005012 066141 060551 020163 066562
    0000220 023475 066562 026440 023551 060412 064554 071541 061440
    0000240 036560 061447 020160 064455 005047 066141 060551 020163
    0000260 073155 023475 073155 026440 023551 021412 060440 064554
    0000300 071541 066040 036554 066047 020163 066055 026440 061455
    0000320 066157 071157 067075 073145 071145 005047 066141 060551
    0000340 020163 066154 023475 071554 026440 023554 060412 064554
    0000360 071541 066040 036555 066047 020163 060455 076154 067555
    0000400 062562 005047 066141 060551 020163 036550 064047 071551
    0000420 067564 074562 005047 021412 051440 072557 061562 020145
    0000440 066147 061157 066141 062040 063145 067151 072151 067551
    0000460 071556 064412 020146 020133 063055 027440 072145 027543
    0000500 060542 064163 061562 056440 020073 064164 067145 004412
    0000520 020056 062457 061564 061057 071541 071150 005143 064546
    0000540 000012
    0000541
    說明
    好了,那麼如果有一個非 ASCII 的資料檔案呢?例如那個 binary 的檔案!使用 vi 根本就是看不著~這個時候看來只有使用將整個資料以數值方法讀出來啦!那就是 od 這個指令來讀出來呦!這個東西可以用來輸出該資料為十進位、16進位等等的資料格式!不過這個東西對於工程師可能比較有用啦!因為印出來的東西都是數字或記憶體當中的資料~~

    檔案與目錄權限:

    Linux 檔案屬性 的內容我們可以知道一個檔案有若干個屬性,包括 ( r, w, x ) 等基本屬性,及是否為目錄 (d) 與檔案 (-) 或者是連結檔 (l) 等等的屬性!那麼要修改屬性的方法在前面也約略提過了,這裡再加強補充一下!此外,由於 Linux 還可以設定其他的系統安全屬性,使用 chattr 來設定,而以 lsattr 來查看,最重要的屬性就是可以設定其不可修改的特性!讓連檔案的擁有者都不能進行修改!這個屬性可是相當重要的,尤其是在安全機制上面( security )!
    chown 改變檔案的擁有人
    chgrp 改變檔案的所屬群組
    chmod 改變檔案的可寫、可讀、可執行等屬性
    umask 改變預設的建立檔案或目錄時的屬性
    chattr 改變檔案的特殊屬性
    lsattr 顯示檔案的特殊屬性!

    • chown

    • 語法
      [root @test /root ]# chown [-R] user:group [目錄名稱]
      參數說明:
      -R    :循環的將該目錄下的所有檔案都改成 user 與 group 的名稱!
      範例:
      [root @test /root]# mkdir /home/test/testing  <==在 /home/test 這個家目錄中建立一個名為 testint 的子目錄
      [root @test /root]# cp * /home/test/testing
      [root @test /root]# chown test /home/test/testing
      [root @test /root]# chown -R test:test /home/test/testing<==將該目錄下的所有目錄或檔案均變為 test 擁有
      說明
      前一個章節才剛講完,應該不會就這樣忘記了吧?!由於 chown 的使用範圍較廣,所以這裡再次的給他複習一下 chown 就好, chgrp 請回前一章內容觀看呦!
       
      記得檔案有『擁有人』及『擁有群組』吧,這個 chown 就是在改變擁有者的指令。剛接觸 Linux 的朋友最容易犯的一個錯誤在哪裡呢?就是以 root 的身份 copy 一個檔案(或路徑)給一般使用者(假設為 test )時,忘記將該檔案的所有人改成 test 了!由於複製者是 root 所以該檔案也會是 root 所有!那麼 test 當然也就不能修改該檔案了!
       
      在上面的例子中,『 chown test /home/test/testing 』這個指令只會將該目錄變成 test 的,但是 group 仍然是 root 的呦!所以你可以使用『 chown test:test /home/test/testing 』,連使用者群組都給他改變一下囉!不過需要注意的是,這兩個指令都只改變了『目錄』 的所有權而已!那麼在這個目錄下的東西也要改變的話,該如何?!呵呵,就使用 -R 這個參數即可!
       

    • chmod

    • 語法
      [root @test /root ]# chmod [-R] [parameter] [目錄名稱]
      參數說明:
      -R   :循環的一直將該目錄的檔案均改變之!
      範例:
      [root @test /root]# chmod 777 .bashrc 
      說明
      還記得在『檔案屬性與系統』那一章吧!一個檔案或目錄至少有九個屬性,三個三個一組,共分為三組!而可以使用數字來當作變換屬性的參考依據!各屬性如下:
      r:4
      w:2
      x:1
      舉個例子來說,當一個屬性為『-rwxr-xr--』時,那是幾分呢?!我們可以將他看成如下『-[rwx][r-x][r--]』三組,所以分數就變成了『[4+2+1][4+0+1][4+0+0]』共有『754』分啦!這樣會算嗎?!OK!測試一下,底下的分數為幾分:
      -r-xr-xr-x
      -rwxrw----
      如果你可以算出『555』與『760』,呵呵!那麼你就應該會算囉!所以,如果你要將 .bashrc 設定成所有人都可以讀取的話,就下達『 chmod 777 .bashrc 』吧!其中需要特別注意的是,通常我們都會允許個人網頁的設定!那麼由於個人網頁預設是記錄在/home/userID/public_html底下,偏偏 /home/userID 的屬性為『drwx------』根本就不允許任何人進入!所以,你最少要將你的目錄設定成 『drwx--x--x』 才可以!當然也可以設定成『drwxr-xr-x』!不過不建議設定成『777』呦!
       

    • umask

    • OK!那麼現在我們知道如何建立或者是改變一個目錄或檔案的屬性了,不過,您知道當你建立一個新的檔案或目錄時,他的預設屬性會是什麼嗎?呵呵!那就與 umask 有關了!那麼 umask 是在搞什麼呢?基本上, umask 就是指定『目前使用者在建立檔案或目錄時候的屬性預設值』,那麼如何得知或設定 umask 呢?他的指定條件以底下的方式來指定:
      語法
      [root @test root]# umask
      0022
      [root@vbird test]# umask 002   <==後面接 3 個數字!
      [root@vbird test]# umask
      0002
      說明
      查看 umask 數值為直接輸入 umask 即可,而設定呢?沒錯!就是 umask 之後接三個數字!那麼如何來指定呢?主要還是跟 Linux 的檔案屬性(那九個屬性, r, w, x )有關的,而且是以分數的那一個關係為例的,而有底下的規則為輔:
       
      • 若使用者建立為『檔案』則預設『沒有可執行 ( x ) 項目』,亦即只有 rw 這兩個項目,也就是最大為 666 分

      • --rw-rw-rw-
      • 若使用者建立為『目錄』,則由於 x 與是否可以進入此目錄有關,因此預設為所有權限均開放,亦即為 777 分

      • drwxrwxrwx
       
      那麼 umask 指定的是『該預設值需要減掉的權限!』因為 r、w、x 分別是 4、2、1 分,所以囉!也就是說,當要拿掉能寫的權限,就是輸入 2 分,而如果要拿掉能讀的權限,也就是 4 分,那麼要拿掉讀與寫的權限,也就是 6 分,而要拿掉執行與寫入的權限,也就是 3 分,這樣瞭解嗎?請問您, 5 分是什麼?呵呵!就是讀與執行的權限啦!如果以上面的例子來說明的話,因為 umask 為 002 ,所以 user, group 並沒有被拿掉屬性,不過 others 的屬性被拿掉了 2 ( 也就是 w 這個屬性 ),那麼由於當使用者:
       
      • 建立檔案時:(-rw-rw-rw-) – (--------w-) ==> -rw-rw-r--
      • 建立目錄時:(drwxrwxrwx) – (--------w-) ==> drwxrwxr-x
       
      不相信嗎?你只要使用 touch test 然後看看這個 test 的檔案屬性,就可以知道了!那麼如何看你這個使用者目前的 umask 呢?直接下達 umask 即可!實作看看先:
       
      [root@vbird test]# umask
      0002
      [root@vbird test]# touch test1
      [root@vbird test]# mkdir test2
      [root@vbird test]# ls -l
      -rw-rw-r--    1 root     root            0 Oct 22 00:00 test1
      drwxrwxr-x    2 root     root         4096 Oct 22 00:00 test2/
      發現了什麼?呵呵! Test1 的屬性為 666-002 = 664 !正確嗎?是的!正確!
      而 test2 這個目錄呢?就是 777-002 = 775 !也正確!

      [root@vbird test]# umask 003
      [root@vbird test]# touch test3
      [root@vbird test]# mkdir test4
      [root@vbird test]# ll
      -rw-rw-r--    1 root     root            0 Oct 22 00:03 test3
      drwxrwxr--    2 root     root         4096 Oct 22 00:03 test4/
      嘿!屬性又跟剛剛的不一樣囉!仔細推敲一下為什麼呦!test3 666-003 =663,這是怎麼一回事?! 663 應該是 -rw-rw--wx 才對啊!怎麼會是上面的屬性!呵呵!這裡就要特別的給他強調了!『盡量不要以數字相加減啦!』容易造成類似上面的問題!你應該要這樣想(-rw-rw-rw-) - (--------wx)=-rw-rw-r--這樣就對啦!瞭解了嗎?不要用十進位的數字喔!夠能力的話,用二進位來算,不曉得的話,用 rwx 來算喔! ^_^

       
      由上面的例子您應該很輕易的就可以發現 umask 的用途!而這個 umask 可以在 /etc/bashrc 裡面進行修改喔!預設的情況之下, root 的 umask 為 022 而一般使用者則為 002 ,因為可寫的權限蠻嚴重的,因此預設都會拿掉這個權限!此外,因為 root 比較重要!所以為了安全的需求,其同群組的寫入屬性就被拿掉了!這東西對於安全性也有一定程度的貢獻呦!
       

    • chattr

    • 語法
      [root @test /root ]# chattr [+-=][ASacdistu] [檔案或目錄名稱]
      參數說明:
      +-= :分別為 [+ 增加] [- 減少] [= 設定] 屬性的意思
      A  :當設定了 A 這個屬性時,這個檔案(或目錄)的存取時間 atime (access) 將不可被修改,
          可避免例如手提式電腦容易有磁碟 I/O 錯誤的情況發生!
      S  :這個功能有點類似 sync 的功能!就是會將資料同步寫入磁碟當中!可以有效的避免資料流失!
      a  :當設定 a 之後,這個檔案將只能增加資料,而不能刪除,只有 root 才能設定這個屬性。
      c  :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮出來!
          但是在儲存的時候,將會先進行壓縮之後再儲存(看來對於大檔案似乎蠻有用的!)
      d  :當 dump (備份)程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)具有 dump 功效!
      i  :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』
          對於系統安全性有相當大的助益!
      j  :當使用 ext3 這個檔案系統格式時,設定 j 屬性將會使檔案在寫入時先記錄在 journal 中!
          但是當 filesystem 設定參數為 data=journalled 時,由於已經設定了日誌了,所以這個屬性無效!
      s  :當檔案設定了 s 參數時,他將會被完全的移除出這個硬碟空間。
      u  :與 s 相反的,當使用 u 來設定檔案時,則資料內容其實還存在磁碟中,可以使用來 undeletion.
      範例:
      [root @test /root]# chattr +i /etc/shadow<==呵呵!如此則無法更動這個檔案囉!
      [root @test /root]# chattr -i /etc/shadow <==解除該屬性!
      說明
      這這個指令是重要的,尤其是在系統的安全性上面!由於這些屬性是隱藏的性質,所以需要以 lsattr 才能看到該屬性呦!其中,個人認為最重要的當屬 +i 這個屬性了,因為他可以讓一個檔案無法被更動,對於需要強烈的系統安全的人來說,真是相當的重要的!裡頭還有相當多的屬性是需要 root 才能設定的呢!此外,如果是 log file 這種的登錄檔,就更需要 +a 這個可以增加,但不會被殺掉的參數了!怎樣?很棒吧!未來提到登錄檔的認知時,我們再來聊一聊如何設定他吧!
       

    • lsattr

    • 語法
      [root @test /root ]# lsattr [-aR]
      參數說明:
      -a :將隱藏檔的屬性也秀出來;
      -R :連同子目錄的資料也一併列出來!
      範例:
      [root @test /root]# chattr +i .bash_logout
      [root @test /root]# lsattr -a 
      -------------- ./.
      -------------- ./..
      ---i---------- ./.bash_logout
      -------------- ./.bash_profile
      -------------- ./.bashrc
      -------------- ./.emacs
      -------------- ./.screenrc
      說明
      這兩個指令在使用上必須要特別小心,例如:某天你心情好,突然將 /etc/shadow 這個重要的密碼記錄檔案給他設定成為具有 i 的屬性,那麼過了若干天之後,你突然要新增使用者,卻一直無法新增!別懷疑,趕快去將 i 的屬性拿掉吧!

    搜尋檔案或目錄:

    檔案的搜尋可就厲害了!因為我們常常需要知道那個檔案放在哪裡,所以來談一談怎麼搜尋吧!在 Linux 底下也有相當優異的搜尋系統呦!通常 find 不很常用的!因為速度慢之外,也很操硬碟!通常我們都是先使用 whereis 或者是 locate 來檢查,如果真的找不到了,才以 find 來搜尋呦!為什麼呢?因為 whereis 與 locate 是利用資料庫來搜尋資料,所以相當的快速,而且並沒有實際的搜尋硬碟,比較省時間啦!
    which   查看可執行檔案的位置
    whereis 查看檔案的位置
    locate  配合資料庫查看檔案位置
    find    實際搜尋硬碟去查詢檔案名稱

  • which

  • 語法
    [root @test /root ]# which  [檔案名稱]
    參數說明:
    範例:
    [root @test /root]# which passwd
    /usr/bin/passwd
    說明
    which 的基本功能是『藉由 PATH 這個環境變數的內容,去該路徑內尋找可執行檔』,所以基本的功能在於『尋找執行檔』囉!
     

  • whereis

  • 語法
    [root @test /root ]# whereis [-bmsu] [目錄名稱]
    參數說明:
    -b    :只找 binary 的檔案
    -m    :只找在說明檔 manual 路徑下的檔案
    -s    :只找 source 來源檔案
    -u    :沒有說明檔的檔案!
    範例:
    [root @test /root]# whereis passwd
    passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.bz2
    將 passwd 相關字眼的檔案或目錄都列出來!

    [root @test /root]# whereis -b passwd
    passwd: /usr/bin/passwd /etc/passwd
    僅列出binary 檔案!

    [root @test /root]# whereis -m passwd
    passwd: /usr/share/man/man1/passwd.1.bz2
    僅搜尋 man page 所在的目錄!

    說明
    如果使用 find 太麻煩,而且時間花用的很大!(因為如果你的硬碟比較老舊的話,嘿嘿!有的等的!)這個時候 whereis 就相當的好用了!另外, whereis 可以加入參數來找尋相關的資料,例如如果你是要找可執行檔( binary )那麼加上 -b 就可以啦!例如上面的範例針對 passwd 這支程式來說明!如果不加任何參數的話,那麼就將所有的資料列出來囉!那麼 whereis 到底是使用什麼咚咚呢?為何搜尋的速度會比 find 快這麼多?!其實那也沒有什麼!這是因為 Linux 系統會將系統內的所有檔案都記錄在一個資料庫檔案裡面,而當使用 whereis 或者是底下要說的 locate 時,都會以此資料庫檔案的內容為準,因此,有的時後你還會發現使用這兩個執行檔時,會找到已經被殺掉的檔案!這就是因為他是一個『資料庫』檔案呀!另外,基本上 Linux 每天會針對 Linux 主機進行 updatedb (就是那一個資料庫檔案囉!)的動作,你可以在 /etc/cron.weekly/slocate.cron 這個檔案找到相關的機制呦!當然,也可以直接使用 /usr/bin/updatedb 來更新資料庫檔案呢!
     

  • locate

  • 語法
    [root @test /root ]# locate [目錄名稱]
    參數說明:
    範例:
    [root @test /root]# locate root
    ……一大堆跟 root 有關字眼的檔案都出來了 @_@

    [root @test /root]# updatedb        <==立刻更新資料庫

    說明
    locate 的使用方式就更簡單了!直接鍵入你要找的檔名即可!但是,這個東西還是有使用上的限制呦!為什麼呢?您會發現使用 locate 來尋找資料的時候特別的快,這是因為 locate 尋找的資料是由『已建立的資料庫 /var/lib/slocate』裡面的資料所搜尋到的,所以不用直接在去硬碟當中存取資料,呵呵!當然是很快速囉!那麼有什麼限制呢?就是因為他是經由資料庫來搜尋的,而資料庫的建立預設是在每個禮拜執行一次,所以當您新建立起來的檔案,卻還在資料庫更新之前搜尋該檔案,那麼 locate 會告訴您『找不到!』呵呵!因為必須要更新資料庫呀!
     
    那麼我到底要建立哪些資料庫呢?是否全部都要建立?似乎不需要,這個時候,你可以自己選擇需要建立檔案資料庫的目錄呢!在 /etc/updatedb.conf 這個內即可設定了!
     
    [root @test root]# more /etc/updatedb.conf
    ## Linux-Mandrake configuration.
    # 由何處開始查詢資料,當然是由根目錄啦!所以填入 / 即可
    FROM="/"

    # 哪些目錄不想要建立檔案搜尋資料,呵呵!就是那些不要的資料嘛!
    # 忘記的話,記得回上一章去看看內容,就知道為何如此設定了!
    PRUNEPATHS="/proc,/tmp,/var/tmp,/usr/tmp,/net,/afs,/mnt"

    # 安全等級
    #   0 代表關閉安全檢驗,速度上面較快速,但較不安全;
    #   1 啟動安全簡易,這是系統的預設值;
    SECURITY="1"

    # 查詢的時候是否要由螢幕輸出?當然不要,否則多麻煩?
    VERBOSE="NO"

    # 資料庫所在處!這是預設值,不要隨意移動,否則會找不到!
    DATABASE="/var/lib/slocate/slocate.db"

    # 哪些檔案系統我們也不搜尋建立?就是光碟啦、非 Linux 的檔案格式啦,
    # 我們都不要進行搜尋資訊的建立啦!
    PRUNEFS="nfs,smbfs,ncpfs,proc,devpts,supermount,vfat,iso9660,udf,usbdevfs,devfs"

     

  • find

  • 語法
    [root @test /root ]# find [路徑] [參數]
    參數說明:
    1. 時間:
       -atime n    :在 n*24 小時之前的一天內被 access 即存取過的檔案列出來!
       -ctime n    :在 n*24 小時之前的一天內被 changed 即改變、新增的檔案或目錄印出
       -mtime n    :在 n*24 小時之前的一天內被 modified 即修改過的檔案印出
       -newer file :比 file 還要新的檔案就列出來!
    2. 使用名稱:
       -gid n      :尋找 群組 ID 為 n 的檔案
       -group name :尋找群組名稱為 name 的檔案
       -uid n      :尋找擁有者 ID 為 n 的檔案
       -user name  :尋找使用者名稱為 name 的檔案
       -name file  :尋找檔名為 file 的檔案名稱(可以使用萬用字元)
       -type type  :尋找檔案屬性為 type 的檔案,type 包含了 b, c, d, p, l, s,
                    這些與前一章的屬性相同!例如 l 為 Link 而 d 為路徑之意!
    範例:
    [root @test /root]# find / -name testing            <==尋找檔名為 testing 
    [root @test /root]# find / -name 'test*'       <==尋找檔名包含 test 的!
    [root @test /root]# find . -ctime 1                 <==尋找目前目錄下一天前新增的目錄或檔案
    [root @test /root]# find /home/test -newer .bashrc  <==尋找 /home/test 目錄下比 .bashrc 還要新的檔案
    [root @test /root]# find /home -user test       <==尋找 /home 底下擁有者為 test 的檔案
    [root @test /root]# find /dev -type b               <==尋找 /dev 這個目錄下,檔案屬性為 b 的檔案
    說明
    如果你要尋找一個檔案的話,那麼使用 find 會是一個不錯的主意!他可以根據不同的參數來給予檔案的搜尋功能!例如你要尋找一個檔名為 httpd.conf 的檔案,你知道他應該是在 /etc 底下,那麼就可以使用『 find /etc -name httpd.conf 』嚕!那如果你記得有一個檔案檔名包含了 httpd ,但是不知道全名怎辦?!呵呵,就用萬用字元 * 吧,如上以:『 find /etc -name '*httpd*' 』就可將檔名含有 httpd 的檔案都列出來囉!不過,由於 find 在尋找資料的時後相當的耗硬碟!所以沒事情不要使用 find 啦!有更棒的指令可以取代呦!那就是 whereislocate 囉!!

    SetUID, SetGID, Sticky bit 與 file 指令

    • SUID 與 SGID:

    • 其實,說到這裡之前,應該先說明一下 UID (user ID)與 GID (Groupt ID)的!基本上, Linux 認得的帳號只是一堆數字而已!而由於我們每個檔案中同時含有『使用者』與『使用者群組』的屬性,因此,就有所謂的 UID 與 GID 囉! UID 代表我們的使用者『代號』而 GID 則是群組的『代號』。你可以使用『 more /etc/passwd 』這個指令來看一下你的系統當中的所有帳號,然後你會注意到每行的第三、四個欄位(以 : 分隔)為數字,那個就是 UID 與 GID 了,您更會注意到的是, root 的 UID 與 GID 都是 0 !因此,當你建立了一個帳號,而你將該帳號的 UID 與 GID 都改為零,呵呵!那個帳號的使用者就具有 root 的身份囉!
       
      那麼什麼是 SUID 與 SGID 呢?!在說明之前我們先來以一般身份使用者 ( 還記得安裝的時候曾經增加一個 test 帳號的一般身份使用者嗎?對啦!用他!然後呢?直接在鍵盤上按下 [Alt] + [Ctrl] + [F2] 到第二個終端機呀!) test 的身份登入,再來看一個檔案的內容:
       
      [test@test test]$ ls -l /usr/bin/passwd 
      -r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd 
       
      看到了 /usr/bin/passwd 檔案的前面屬性了嗎?怎麼會有 s 的屬性在原本的 x 呀!?那個就是所謂的 SUID 了!如果是『 -r-xr-s--x 』時,那麼 s 就成為所謂的 SGID 了!
       
        當一個檔案具有 SUID 的時候,同時 other 的群組具有可執行的權限,那麼當 others 群組執行該程式的時候, other 將擁有該檔案的 owner 的權限!』。
        
      [test@test test]$ ls -l /usr/bin/passwd /etc/shadow 
      -r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd 
      -rw-------    1 root     root         2423 Jun 25 14:29 /etc/shadow 
       
      我們以帳號的密碼檔來說明好了!注意上面的範例囉!可以看到的是, /etc/shadow 的權限是『只有 root 才能存取』呦!那麼你會不會覺得很奇怪?明明我的一般使用者可以自己修改密碼呀!對不對?那麼修改密碼一定跟 /etc/shadow 這個檔案有關,那麼怎麼回事呀!?使用者是如何修改 /etc/shadow 這個檔案的呢?嗯!沒錯!就是使用 SUID 的功能啦!上面的例子說明了, /usr/bin/passwd 這個檔案具有 SUID 的屬性,那麼當使用者使用 /usr/bin/passwd 這個執行檔時,在執行 pass word 修改的期間就具有 /usr/bin/passwd 這個檔案的擁有者 root 的所屬權限囉!所以,所以當一般使用者執行 passwd 的時候,將具有 root 的權限,所以他們也可以更改 /etc/shadow 的內容囉!那麼由此也可以知道,由於這個 Set UID ( SUID ) 的主要功能是在『某個檔案執行的期間具有檔案擁有者的權限』,因此, s 就是替代上面提到的 x 這個可執行的位置囉!那萬一該檔案並沒有 x 的屬性呢?哈哈!問的好!那麼該檔案的屬性就會將小寫的 s 變成大寫的 S 啦! ( 這裡即使暫時不瞭解也沒有關係,等到過一陣子再回來看一看,你就會瞭解啦! )
       
      不過,由此也知道 SUID 與 SGID 的問題所在,沒錯!就是太不安全了!如果你有一個檔案具有 root 的權限,那麼當開啟了 SUID 的時候,嘿嘿!夠你瞧的了!!因此上,在變更一個檔案成為具有 SUID 或 SGID 的情況時,必須要特別小心呢!知道乎!?
       
    • Sticky bit:

    • OK!接著下來,我們要來看一下,既然有 SUID 與 SGID ,那麼為什麼沒有在最末位出現 s 取代 x 呢?呵呵!這當然沒有必要啦!因為那是屬於 others 的權限,你的檔案如果是任何人皆可執行的話,那麼本來他們就具有權限啦!幹嘛還要設定 s 的屬性!?不過,這裡卻真的有另一個屬性出現了,那就是 Sticky bit 的屬性 ( t ) !這個屬性的最大用處在於『具有 sticky bit 屬性的該”目錄”下的檔案,其檔案或目錄只有檔案擁有者及 root 才有權力刪除!』這樣是否可以瞭解了呢?嘿嘿!沒錯!在我們系統裡面本來就預設有一個啦!那就是 /tmp 這個目錄!
        
      [test@test test]$ ls -l / 
      drwxrwxrwt    2 root     root         4096 Jul 18 13:08 tmp 
       
      如何,發現了吧!雖然該目錄具有所有人皆可讀寫的權限,但是確有一個 t 出現了,那就是所謂的 sticky bit 囉!在該目錄裡面雖然你可以建立與修改任何檔案,但是卻僅能刪除自己建立的檔案呢!除非你是 root !你可以這樣試試看囉:
       
        1. 以 root 登入系統,並且進入 /tmp 當中;
        2. touch test,並且更改 test 權限成為 777 ;
        3. 以一般使用者登入,並進入 /tmp;
        4. 嘗試刪除 test 這個檔案!
       
      如何!?發現了吧!!
       
    • SUID, SGID, Sticky bit 的設定方法:

    • 前面介紹過 SUID 與 SGID 的功能,那麼如何開啟檔案使成為具有 SUID 與 SGID 的權限呢?!這就需要剛剛的數字更改權限的方法了!現在你應該已經知道數字型態個更改權限方式為『三個數字』的組合,那麼如果在這三個數字之前再加上一個數字的話,那最前的面數字就代表這幾個屬性了! ( 註:通常我們使用 chmod xyz filename 的方式來設定 filename 的屬性時,則是假設沒有 SUID, SGID 及 Sticky bit 啦! )
       
      • 4 為 SUID
      • 2 為 SGID
      • 1 為 Sticky bit
       
      假設要將一個檔案屬性改為『-rwsr-xr-x』時,由於 s 在使用者權限中,所以是 SUID ,因此,在原先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來設定!此外,還有大 S 與大 T 的產生喔!參考底下的範例啦!
       
      [root@test tmp]# touch test
      [root@test tmp]# ll
      total 0
      -rw-r--r--    1 root     root            0 Feb  6 23:08 test
      [root@test tmp]# chmod 4755 test
      [root@vbird tmp]# ll
      total 0
      -rwsr-xr-x    1 root     root            0 Feb  6 23:08 test*
      [root@test tmp]# chmod 6755 test
      [root@test tmp]# ll
      total 0
      -rwsr-sr-x    1 root     root            0 Feb  6 23:08 test*
      [root@test tmp]# chmod 1755 test
      [root@test tmp]# ll
      total 0
      -rwxr-xr-t    1 root     root            0 Feb  6 23:08 test*
      上面的三個例子應該都很好說明啊!就是直接將 x 以 s 或者是 t 來取代就是了!也就是分別為 SUID, SGID 及 sticky bit 的設定方法啦!

      [root@test tmp]# chmod 7666 test
      [root@test tmp]# ll
      total 0
      -rwSrwSrwT    1 root     root            0 Feb  6 23:08 test
      這個例子就要特別小心啦!怎麼會出現大寫的 S 與 T 呢?不都是小寫的嗎?因為 s 與 t 都是取代 x 這個參數的,但是你有沒有發現阿,我們是下達 7666 喔!也就是說, user, group 以及 others 都沒有 x 這個可執行的標誌 ( 因為 666 嘛! ),所以,這個 S, T 代表的就是『空的』啦!怎麼說? SUID 是表示『該檔案在執行的時候,具有檔案擁有者的權限』,但是檔案擁有者都無法執行了,哪裡來的權限給其他人使用?當然就是空的啦! ^_^

       
    • file

    • 語法
      [root @test /root ]# file [檔名] 
      參數說明: 
      範例: 
      [root @test /root]# file ~/.bashrc 
      /root/.bashrc: ASCII text  <==表示這個檔案是 ASCII 純文字檔 

      [root @test /root]# file /usr/bin/passwd
      /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped
      嘿!還可以看到是否具有 SUID 的權限呢!

      說明
      file 這個指令也蠻好用的,可以用來查看這個檔案的類型,例如 ASCII 格式檔,或者是 binary 的檔案等等,還可以用來觀看檔案是否被加入 SUID 等等的資訊!並且,也同時提供了是否有使用動態函式庫的資訊!相當的好用!

    本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看)

    • 什麼是絕對路徑與相對路徑

    • 答:
        絕對路徑的寫法為由 / 開始寫,至於相對路徑則不由 / 開始寫!
    • 如何更改一個目錄的名稱?例如由 /home/test 變為 /home/test2

    • 答:
        mv /home/test /home/test2
    • PATH 這個環境變數的意義?

    • 答:
        這個是用來指定執行檔執行的時候,檔案搜尋的目錄路徑。
    • umask 有什麼用處與優點?

    • 答:
        umask 可以拿掉一些屬性,因此,適當的定義 umask 有助於系統的安全,因為他可以用來建立預設的目錄或檔案的權限。
    • 當一個使用者的 umask 分別為 033 與 044 他所建立的檔案與目錄的權限為何?

    • 答:
        在 umask 為 033 時,則預設是拿掉 group 與 other 的 w(2)x(1) 權限,因此權限就成為『檔案 –rw-r--r-- , 目錄 drwxr--r-- 』而當 umask 044 時,則拿掉 r 的屬性,因此就成為『檔案 -rw--w--w-,目錄 drwx-wx-wx』
    • 什麼是 SUID ?

    • 答:
        當一個指令具有 SUID 的功能時,則當其他人使用這個指令時,該程序將具有指令擁有者的權限。
    • 當我要查詢 /usr/bin/passwd 這個檔案的一些屬性時,可以使用什麼指令來查詢?

    • 答:
        ls –al, file, lsattr
    • 嘗試用 find 找出目前 linux 系統中,所有具有 SUID 的檔案有哪些?

    • 答:
        find / -type f –perm –04000 -print
    修改歷史:
    伺服器篇文件
    各版本彙整說明
    CentOS 6.x