說明在 Linux 底下處理檔案與目錄的相關指令啊~^_^
本文資料主要針對 Fedora Core 4 的系統進行說明, Fedora Core 1 主要是由 Red Hat Linux 9 改版而來, 這個 Red Hat Linux 9 並不是當前大家聽到的 RHEL 喔!那是在 RHEL 出現之前的產品,基本上是在 2003 年以前的作品了!Fedora Core 4 則是在 2005 年 6 月份釋出,使用的核心是 2.6.11 版,當時是很紅的一個作品!只是生命週期太短,所以用這個 Fedora 系列來介紹 Server, 當時的決定確實有點莫名其妙了...
建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 Fedora Core 4 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
在前一章節裡面我們認識了 Linux 系統下的檔案權限概念以及目錄的配置說明。 在這個章節當中,我們就直接來進一步的操作與管理檔案與目錄吧!包括在不同的目錄間變換、 建立與刪除目錄、建立與刪除檔案,還有尋找檔案、查閱檔案內容等等, 都會在這個章節作個簡單的介紹啊!
. 代表此層目錄
.. 代表上一層目錄
- 代表前一個工作目錄
~ 代表『目前使用者身份』所在的家目錄
~account 代表 account 這個使用者的家目錄
而在目錄底下有兩個目錄是一定會存在的!那就是 . 與 .. 囉~
分別代表此層與上層目錄的意思。那我們在前一章 Linux 檔案屬性與目錄配置
裡面也知道根目錄 (/) 是所有目錄的最頂層,那麼 / 有 .. 嗎?!您可以使用 ls -al / 去看看,
答案是『有的!』不過,您也可以查閱到,根目錄的 . 與 .. 屬性完全一模一樣,哈哈!
原來根目錄的頂層 (..) 與他自己 (.) 是同一個目錄啦! ^_^[root@linux ~]# cd [相對路徑或絕對路徑] # 最重要的就是目錄的絕對路徑與相對路徑,還有一些特殊目錄的符號囉! [root@linux ~]# cd ~dmtsai # 代表去到 dmtsai 這個使用者的家目錄,亦即 /home/dmtsai [root@linux dmtsai]# cd ~ # 表示回到自己的家目錄,亦即是 /root 這個目錄 [root@linux ~]# cd # 沒有加上任何路徑,也還是代表回到自己家目錄的意思喔! [root@linux ~]# cd .. # 表示去到目前的上層目錄,亦即是 /root 的上層目錄的意思; [root@linux /]# cd - # 表示回到剛剛的那個目錄,也就是 /root 囉~ [root@linux ~]# cd /var/spool/mail # 這個就是絕對路徑的寫法!直接指定要去的完整路徑名稱! [root@linux mail]# cd ../mqueue # 這個是相對路徑的寫法,我們由 /var/spool/mail 去到 /var/spool/mqueue 就這樣寫!cd 是 Change Directory 的縮寫,這是用來變換工作目錄的指令。注意,目錄名稱與 cd 指令之間存在一個空格。 一登入 Linux 系統後,root 會在 root 的家目錄,亦即 /root 下,OK!那回到上一層目錄可以用『 cd .. 』。 利用相對路徑的寫法必須要確認您目前的路徑才能正確的去到想要去的目錄。例如上表當中最後一個例子, 您必須要確認您是在 /var/spool/mail 當中,並且知道在 /var/spool 當中有個 mqueue 的目錄才行啊~ 這樣才能使用 cd ../mqueue 去到正確的目錄說,否則就要直接輸入 cd /var/spool/mqueue 囉~
[root@linux ~]# pwd [-P] 參數: -P :顯示出確實的路徑,而非使用連結 (link) 路徑。 範例: [root@linux ~]# pwd /root <== 顯示出目錄啦~ [root@linux ~]# cd /var/mail [root@linux mail]# pwd /var/mail [root@linux mail]# pwd -P /var/spool/mail <== 怎麼回事?有沒有加 -P 差很多~ [root@linux mail]# ls -l /var/mail lrwxrwxrwx 1 root root 10 Jun 25 08:25 /var/mail -> spool/mail # 看到這裡應該知道為啥了吧?因為 /var/mail 是連結檔,連結到 /var/spool/mail # 所以,加上 pwd -P 的參數後,會不以連結檔的資料顯示,而是顯示正確的完整路徑啊!pwd 是 Print Working Directory 的縮寫,也就是顯示目前所在目錄的指令, 例如在上個表格最後的目錄是 /var/mail 這個目錄,但是提示字元僅顯示 mail, 如果你想要知道目前所在的目錄,可以輸入 pwd 即可。此外,由於很多的套件所使用的目錄名稱都相同,例如 /usr/local/etc 還有 /etc ,但是通常 Linux 僅列出最後面那一個目錄而已,這個時候你就可以使用 pwd 來知道你的所在目錄囉!免得搞錯目錄,結果……
[root@linux ~]# mkdir [-mp] 目錄名稱 參數: -m :設定檔案的權限喔!直接設定,不需要看預設權限 (umask) 的臉色~ -p :幫助你直接將所需要的目錄遞迴建立起來! 範例: [root@linux ~]# cd /tmp [root@linux tmp]# mkdir test <== 建立一名為 test 的新目錄 [root@linux tmp]# mkdir test1/test2/test3/test4 mkdir: cannot create directory `test1/test2/test3/test4': No such file or directory <== 沒辦法直接建立此目錄啊! [root@linux tmp]# mkdir -p test1/test2/test3/test4 # 加了這個 -p 的參數,可以自行幫您建立多層目錄! [root@linux tmp]# mkdir -m 711 test2 [root@linux 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 # 仔細看上面的權限部分,如果沒有加上 -m 來強制設定屬性,系統會使用預設屬性。 # 那麼您的預設屬性為何?這要透過底下介紹的 umask 才能瞭解喔! ^_^如果想要建立新的目錄的話,那麼就使用 mkdir (make directory) 吧! 不過,請注意呦!在預設的情況下, 你所需要的目錄得一層一層的建立才行!例如:假如你要建立一個目錄為 /home/bird/testing/test1,那麼首先必須要有 /home 然後 /home/bird ,再來 /home/bird/testing 都必須要存在,才可以建立 /home/bird/testing/test1 這個目錄!假如沒有 /home/bird/testing 時,就沒有辦法建立 test1 的目錄囉!不過,現在有個更簡單有效的方法啦!那就是加上 -p 這個參數喔!你可以直接下達:『 mkdir -p /home/bird/testing/test1 』 則系統會自動的幫你將 /home, /home/bird, /home/bird/testing 依序的建立起目錄!並且, 如果該目錄本來就已經存在時,系統也不會顯示錯誤訊息喔!挺快樂的吧! ^_^
[root@linux ~]# rmdir [-p] 目錄名稱 參數: -p :連同上層『空的』目錄也一起刪除 範例: [root@linux 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@linux tmp]# rmdir test [root@linux tmp]# rmdir test1 rmdir: `test1': Directory not empty [root@linux tmp]# rmdir -p test1/test2/test3/test4 [root@linux tmp]# ls -l drwx--x--x 2 root root 4096 Jul 18 12:54 test2 # 瞧!利用 -p 這個參數,立刻就可以將 test1/test2/test3/test4 一次刪除~ # 不過要注意的是,這個 rmdir 僅能『刪除空的目錄』喔!如果想要建立刪除舊有的目錄時,就使用 rmdir 吧!例如將剛剛建立的 test 殺掉,使用 rmdir test 即可!請注意呦!目錄需要一層一層的刪除才行!而且 被刪除的目錄裡面必定不能還有其他的目錄或檔案! 這也是所謂的空的目錄 (empty directory) 的意思啊!那如果要將所有目錄下的東西都殺掉呢?! 這個時候就必須使用 rm -rf test 囉!不過,還是使用 rmdir 比較不危險!不過,你也可以嘗試以 -p 的參數加入,來刪除上層的目錄喔!
[root@linux ~]# echo $PATH
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
注意到了嗎?對啦! /bin 在 PATH 的設定之中,所以自然就可以找的到 ls 啦!
PATH 對於執行檔來說,是個很重要的『變數』,他主要是用來規範指令搜尋的目錄。
而每個目錄是有順序的,每個目錄中間以冒號『:』來分隔,就如同上面範例中提到的囉!
那麼 PATH 這個變數還有什麼地方重要呢?
[root@linux ~]# PATH="$PATH":/root
這種方式來增加 PATH 搜尋目錄即可!另一種方式則是使用完整檔名來下達指令,
亦即直接使用相對或絕對路徑來執行,例如:[root@linux ~]# /root/ls [root@linux ~]# ./ls因為在同一個目錄中,而我們又知道在同一個目錄中的目錄符號為『 . 』,因此,就以上面的 ./ls 來執行也可以!這種執行方式以後您應該會很常見到才對!
[root@linux ~]# ls [-aAdfFhilRS] 目錄名稱 [root@linux ~]# ls [--color={none,auto,always}] 目錄名稱 [root@linux ~]# ls [--full-time] 目錄名稱 參數: -a :全部的檔案,連同隱藏檔( 開頭為 . 的檔案) 一起列出來~ -A :全部的檔案,連同隱藏檔,但不包括 . 與 .. 這兩個目錄,一起列出來~ -d :僅列出目錄本身,而不是列出目錄內的檔案資料 -f :直接列出結果,而不進行排序 (ls 預設會以檔名排序!) -F :根據檔案、目錄等資訊,給予附加資料結構,例如: *:代表可執行檔; /:代表目錄; =:代表 socket 檔案; |:代表 FIFO 檔案; -h :將檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來; -i :列出 inode 位置,而非列出檔案屬性; -l :長資料串列出,包含檔案的屬性等等資料; -n :列出 UID 與 GID 而非使用者與群組的名稱 (UID與GID會在帳號管理提到!) -r :將排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到小; -R :連同子目錄內容一起列出來; -S :以檔案容量大小排序! -t :依時間排序 --color=never :不要依據檔案特性給予顏色顯示; --color=always :顯示顏色 --color=auto :讓系統自行依據設定來判斷是否給予顏色 --full-time :以完整時間模式 (包含年、月、日、時、分) 輸出 --time={atime,ctime} :輸出 access 時間或 改變權限屬性時間 (ctime) 而非內容變更時間 (modification time) 範例:在 Linux 系統當中,這個 ls 指令可能是最常被執行的吧!因為我們隨時都要知道檔案或者是目錄的相關資訊啊~ 不過,我們 Linux 的檔案所記錄的資訊實在是太多了, ls 沒有需要全部都列出來呢~ 所以,當您只有下達 ls 時,預設顯示的只有:非隱藏檔的檔名、 以檔名進行排序及檔名代表的顏色顯示;如此而已。舉例來說, 您下達 ls /etc 之後,只有經過排序的檔名以及以藍色顯示目錄及白色顯示一般檔案,如此而已。
範例一:將家目錄下的所有檔案列出來(含屬性與隱藏檔) [root@linux ~]# ls -al ~ total 252 drwxr-x--- 9 root root 4096 Jul 16 23:40 . drwxr-xr-x 24 root root 4096 Jul 16 23:45 .. -rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg -rw------- 1 root root 12543 Jul 18 01:23 .bash_history -rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout -rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log -rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog drwx------ 2 root root 4096 Jul 4 16:03 .ssh -rw------- 1 root root 12613 Jul 16 23:40 .viminfo # 這個時候您會看到以 . 為開頭的幾個檔案,以及目錄檔 ./../.ssh 等等, # 不過,目錄檔都是以深藍色顯示,有點不容易看清楚就是了。 範例二:承上題,不顯示顏色,但在檔名末顯示出該檔名代表的類型(type) [root@linux ~]# ls -alF --color=never ~ total 252 drwxr-x--- 9 root root 4096 Jul 16 23:40 ./ drwxr-xr-x 24 root root 4096 Jul 16 23:45 ../ -rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg -rw------- 1 root root 12543 Jul 18 01:23 .bash_history -rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout -rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log -rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog drwx------ 2 root root 4096 Jul 4 16:03 .ssh/ -rw------- 1 root root 12613 Jul 16 23:40 .viminfo # 注意看到顯示結果的第一行,嘿嘿~知道為何我們會下達類似 ./command # 之類的指令了吧?因為 ./ 代表的是『目前目錄下』的意思啊!至於什麼是 FIFO/Socket ? # 請參考前一章節的介紹啊! 範例三:完整的呈現檔案的修改時間 *(modification time) [root@linux ~]# ls -al --full-time ~ total 252 drwxr-x--- 9 root root 4096 2005-07-16 23:40:13.000000000 +0800 . drwxr-xr-x 24 root root 4096 2005-07-16 23:45:05.000000000 +0800 .. -rw------- 1 root root 1491 2005-06-25 08:53:37.000000000 +0800 anaconda-ks.cfg -rw------- 1 root root 12543 2005-07-18 01:23:33.000000000 +0800 .bash_history -rw-r--r-- 1 root root 24 2004-12-04 05:44:13.000000000 +0800 .bash_logout -rw-r--r-- 1 root root 191 2004-12-04 05:44:13.000000000 +0800 .bash_profile -rw-r--r-- 1 root root 395 2005-07-04 11:45:16.000000000 +0800 .bashrc -rw-r--r-- 1 root root 68495 2005-06-25 08:53:34.000000000 +0800 install.log -rw-r--r-- 1 root root 5976 2005-06-25 08:53:28.000000000 +0800 install.log.syslog drwx------ 2 root root 4096 2005-07-04 16:03:24.000000000 +0800 .ssh -rw------- 1 root root 12613 2005-07-16 23:40:13.000000000 +0800 .viminfo # 請仔細看,上面的『時間』欄位變了喔!變成較為完整的格式。 # 一般來說, ls -al 僅列出目前短格式的時間,有時不會列出年份, # 藉由 --full-time 可以查閱到比較正確的完整時間格式啊!其實 ls 的用法還有很多,包括查閱檔案所在 i-node 的 ls -i 參數,以及用來進行檔案排序的 -S 參數,還有用來查閱不同時間的動作的 --time=atime 等參數。而這些參數的存在都是因為 Linux 檔案系統記錄了很多有用的資訊的緣故。那麼 Linux 的檔案系統中,這些與權限、屬性有關的資料放在哪裡呢? 放在 i-node 裡面。關於這部分,我們會在下個章節繼續跟您作比較深入的介紹啊!
[root@linux ~]# cp [-adfilprsu] 來源檔(source) 目的檔(destination) [root@linux ~]# cp [options] source1 source2 source3 .... directory 參數: -a :相當於 -pdr 的意思; -d :若來源檔為連結檔的屬性(link file),則複製連結檔屬性而非檔案本身; -f :為強制 (force) 的意思,若有重複或其他疑問時,不會詢問使用者,而強制複製; -i :若目的檔(destination)已經存在時,在覆蓋時會先詢問是否真的動作! -l :進行硬式連結 (hard link) 的連結檔建立,而非複製檔案本身; -p :連同檔案的屬性一起複製過去,而非使用預設屬性; -r :遞迴持續複製,用於目錄的複製行為; -s :複製成為符號連結檔 (symbolic link),亦即『捷徑』檔案; -u :若 destination 比 source 舊才更新 destination ! 最後需要注意的,如果來源檔有兩個以上,則最後一個目的檔一定要是『目錄』才行! 範例: 範例一:將家目錄下的 .bashrc 複製到 /tmp 下,並更名為 bashrc [root@linux ~]# cd /tmp [root@linux tmp]# cp ~/.bashrc bashrc [root@linux tmp]# cp -i ~/.bashrc bashrc cp: overwrite `basrhc'? n # 重複作兩次動作,由於 /tmp 底下已經存在 bashrc 了,加上 -i 參數, # 則在覆蓋前會詢問使用者是否確定!可以按下 n 或者 y 呢! # 但是,反過來說,如果不想要詢問時,則加上 -f 這個參數來強制直接覆蓋! 範例二:將 /var/log/wtmp 複製到 /tmp 底下 [root@linux tmp]# cp /var/log/wtmp . <==想要複製到目前的目錄,最後的 . 不要忘 [root@linux tmp]# ls -l /var/log/wtmp wtmp -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp -rw-r--r-- 1 root root 71808 Jul 18 21:58 wtmp # 注意到了嗎?!在不加任何參數的情況下,檔案的所屬者會改變,連權限也跟著改變了~ # 這是個很重要的特性!要注意喔!還有,連檔案建立的時間也不一樣了! # 如果您想要將檔案的所有特性都一起複製過來,可以加上 -a 喔! [root@linux tmp]# cp -a /var/log/wtmp wtmp_2 [root@linux tmp]# ls -l /var/log/wtmp wtmp_2 -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 wtmp_2 # 瞭了吧!整個資料特性完全一模一樣ㄟ!真是不賴~這就是 -a 的特性! 範例三:複製 /etc/ 這個目錄下的所有內容到 /tmp 底下 [root@linux tmp]# cp /etc/ /tmp cp: omitting directory `/etc' <== 如果是目錄,不能直接複製,要加上 -r 的參數 [root@linux tmp]# cp -r /etc/ /tmp # 還是要再次的強調喔! -r 是可以複製目錄,但是,檔案與目錄的權限會被改變~ # 所以,也可以利用 cp -a /etc /tmp 來下達指令喔! 範例四:將範例一複製的 bashrc 建立一個連結檔 (symbolic link) [root@linux tmp]# ls -l bashrc -rw-r--r-- 1 root root 395 Jul 18 22:08 bashrc [root@linux tmp]# cp -s bashrc bashrc_slink [root@linux tmp]# cp -l bashrc bashrc_hlink [root@linux tmp]# ls -l bashrc* -rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc -rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc_hlink lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc # 那個 bashrc_slink 是由 -s 的參數造成的,建立的是一個『捷徑』, # 所以您會看到在檔案的最右邊,會顯示這個檔案是『連結』到哪裡去的! # 至於那個 bashrc_hlink 有趣了!建立了這個檔案之後, bashrc 與 bashrc_hlink # 所有的參數都一樣,只是,第二欄的 link 數改變成為 2 了~而不是原本的 1 喔! # 這兩種連結的方式的異同,我們會在下一章裡面進行介紹的! 範例五:若 ~/.bashrc 比 /tmp/bashrc 新才複製過來 [root@linux tmp]# cp -u ~/.bashrc /tmp/bashrc # 這個 -u 的特性,是在目標檔案與來源檔案有差異時,才會複製的。 # 所以,比較常被用於『備份』的工作當中喔! ^_^ 範例六:將範例四造成的 bashrc_slink 複製成為 bashrc_slink_2 [root@linux tmp]# cp bashrc_slink bashrc_slink_2 [root@linux tmp]# ls -l bashrc_slink* lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc -rw-r--r-- 1 root root 395 Jul 18 22:48 bashrc_slink_2 # 這個例子也是很有趣喔!原本複製的是連結檔,但是卻將連結檔的實際檔案複製過來了 # 也就是說,如果沒有加上任何參數時,複製的是原始檔案,而非連結檔的屬性! # 若要複製連結檔的屬性,就得要使用 -d 或者 -a 的參數了! 範例七:將家目錄的 .bashrc 及 .bash_history 複製到 /tmp 底下 [root@linux tmp]# cp ~/.bashrc ~/.bash_history /tmp # 可以將多個資料一次複製到同一個目錄去!這個 cp 的功能很多,而由於我們常常在進行一些資料的複製,所以也會常常用到這個指令的。 一般來說,我們如果去複製別人的資料 (當然,該檔案您必須要有 read 的權限才行啊! ^_^) 時, 總是希望複製到的資料最後是我們自己的,所以,在預設的條件中, cp 的來源檔與目的檔的權限是不同的,目的檔的擁有者通常會是指令操作者本身。舉例來說, 上面的範例二中,由於我是 root 的身份,因此複製過來的檔案擁有者與群組就改變成為 root 所有了! 這樣說,可以明白嗎?! ^_^
[root@linux ~]# rm [-fir] 檔案或目錄 參數: -f :就是 force 的意思,強制移除; -i :互動模式,在刪除前會詢問使用者是否動作 -r :遞迴刪除啊!最常用在目錄的刪除了 範例: 範例一:建立一檔案後予以刪除 [root@linux ~]# cd /tmp [root@linux tmp]# cp ~/.bashrc bashrc [root@linux tmp]# rm -i bashrc rm: remove regular file `bashrc'? y # 如果加上 -i 的參數就會主動詢問喔!那麼如果不要詢問呢?就加 -f 參數啊! 範例二:刪除一個不為空的目錄 [root@linux tmp]# mkdir test [root@linux tmp]# cp ~/.bashrc test/ <== 將檔案複製到此目錄去,就不是空的目錄了 [root@linux tmp]# rmdir test rmdir: `test': Directory not empty <== 刪不掉啊!因為這不是空的目錄! [root@linux tmp]# rm -rf test 範例三:刪除一個帶有 - 開頭的檔案 [root@linux tmp]# ls *aa* -rw-r--r-- 1 root root 0 Aug 22 10:52 -aaa- [root@linux tmp]# rm -aaa- rm: invalid option -- a Try `rm --help' for more information. <== 因為 "-" 是參數嘛! [root@linux tmp]# rm ./-aaa-這是移除的指令( remove ),相當於 dos 下的 del 指令!這裡要注意的是,通常在 Linux 系統下,為了怕檔案被誤殺,所以很多 distributions 都已經預設有 -i 這個參數, -i 是指每個檔案被殺掉之前都會讓使用者確認一次,以預防誤殺檔案!而如果要連目錄下的東西都一起殺掉的話, 例如子目錄裡面還有子目錄時,那就要使用 -rf 這個參數了!不過,使用『 rm -rf 』這個指令之前,請千萬注意了,因為,該目錄或檔案『肯定』會被 root 殺掉!因為系統不會再次詢問你是否要砍掉呦!所以那是個超級嚴重的指令下達呦! 得特別注意!不過,如果你確定該目錄不要了,那麼使用 rm -rf 來循環殺掉是不錯的方式!
[root@linux ~]# mv [-fiu] source destination [root@linux ~]# mv [options] source1 source2 source3 .... directory 參數: -f :force 強制的意思,強制直接移動而不詢問; -i :若目標檔案 (destination) 已經存在時,就會詢問是否覆蓋! -u :若目標檔案已經存在,且 source 比較新,才會更新 (update) 範例: 範例一:複製一檔案,建立一目錄,將檔案移動到目錄中 [root@linux ~]# cd /tmp [root@linux tmp]# cp ~/.bashrc bashrc [root@linux tmp]# mkdir mvtest [root@linux tmp]# mv bashrc mvtest # 將某個檔案移動到某個目錄去,就是這樣做! 範例二:將剛剛的目錄名稱更名為 mvtest2 [root@linux tmp]# mv mvtest mvtest2 <== 這樣就更名了!簡單~ # 其實在 Linux 底下還有個有趣的指令,名稱為 rename , # 該指令則專職進行檔案的更名呢!用途也是不少~可以參閱 man rename 喔! 範例三:再建立兩個檔案,再全部移動到 /tmp/mvtest2 當中 [root@linux tmp]# cp ~/.bashrc bashrc1 [root@linux tmp]# cp ~/.bashrc bashrc2 [root@linux tmp]# mv bashrc1 bashrc2 mvtest2 # 注意到這邊,如果有多個來源檔案或目錄,則最後一個目標檔一定是『目錄!』 # 意思是說,將所有的資料移動到該目錄的意思!這是搬移 (move) 的意思!當你要移動檔案或目錄的時後,呵呵!這個指令就很重要啦! 同樣的,你也可以使用 -u ( update )來測試新舊檔案,看看是否需要搬移囉! 另外一個用途就是『變更檔名!』,我們可以很輕易的使用 mv 來變更一個檔案的檔名呢!不過,在 Linux 才有的指令當中,有個 rename , 可以用來更改大量檔案的檔名,您可以利用 man rename 來查閱一下,也是挺有趣的指令喔!
[root@linux ~]# basename /etc/sysconfig/network network <== 很簡單!就取得最後的檔名~ [root@linux ~]# dirname /etc/sysconfig/network /etc/sysconfig <== 取得的變成目錄名了!很簡單的應用吧!
[root@linux ~]# cat [-AEnTv] 參數: -A :相當於 -vET 的整合參數,可列出一些特殊字符~ -E :將結尾的斷行字元 $ 顯示出來; -n :列印出行號; -T :將 [tab] 按鍵以 ^I 顯示出來; -v :列出一些看不出來的特殊字符 範例: 範例一:檢閱 /etc/issue 這個檔案的內容 [root@linux ~]# cat /etc/issue Fedora Core release 4 (Stentz) Kernel \r on an \m 範例二:承上題,順便列印出行號時! [root@linux ~]# cat -n /etc/issue 1 Fedora Core release 4 (Stentz) 2 Kernel \r on an \m 3 # 看到了吧!可以印出行號呢!這對於大檔案要找某個特定的行時,有點用處! 範例三:將 /etc/xinetd.conf 的內容完整的顯示出來(包含特殊字元) [root@linux ~]# cat -A /etc/xinetd.conf #$ # Simple configuration file for xinetd$ #$ # Some defaults, and include /etc/xinetd.d/$ $ defaults$ {$ ^Iinstances = 60$ log_type = SYSLOG authpriv$ log_on_success^I^I= HOST PID$ log_on_failure^I^I= HOST$ ^Icps^I^I^I= 25 30$ }$ $ includedir /etc/xinetd.d$ # 在一般的環境中,列印出來的結果在有 [tab] 與空白鍵,其實看不出來, # 那麼使用 cat -A 時,會將 [tab] 按鍵以 ^I 顯示,而斷行字元也會顯示出來~ # 最特殊的當然就是斷行字元了!這個段行字元在 Linux 與 Windows 是不一樣的。 # 在 Linux 是以 $ 為斷行字元,而在 Windows 則是以 ^M$ 為斷行字元。 # 這部分我們會在 vi 軟體的介紹時,再次的說明到喔!嘿嘿! Linux 裡面有『貓』?!喔!不是的, cat 是 Concatenate (連續)的簡寫, 主要的功能是將一個檔案的內容連續的印出在螢幕上面!例如上面的例子中,我們將 /etc/issue 印出來!如果加上 -n 的話,則每一行前面還會加上行號呦!鳥哥個人是比較少用 cat 啦!畢竟當你的檔案內容的行數超過 40 行以上,嘿嘿!根本來不及看!所以,配合等一下要介紹的 more 或者是 less 來執行比較好!此外,如果是一般的 DOS 檔案時,就需要特別留意一些奇奇怪怪的符號了, 例如斷行與 [tab] 等,要顯示出來,就得加入 -A 之類的參數了!
[root@linux ~]# tac /etc/issue Kernel \r on an \m Fedora Core release 4 (Stentz) # 嘿嘿!與剛剛上面的範例一比較,是由最後一行先顯示喔!tac 這個好玩了!怎麼說呢?詳細的看一下, cat 與 tac ,有沒有發現呀!對啦! tac 剛好是將 cat 反寫過來,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最後一行連續顯示在螢幕上』,而 tac 則是『 由最後一行到第一行反向在螢幕上顯示出來 』,很好玩吧!
[root@linux ~]# nl [-bnw] 檔案 參數: -b :指定行號指定的方式,主要有兩種: -b a :表示不論是否為空行,也同樣列出行號; -b t :如果有空行,空的那一行不要列出行號; -n :列出行號表示的方法,主要有三種: -n ln :行號在螢幕的最左方顯示; -n rn :行號在自己欄位的最右方顯示,且不加 0 ; -n rz :行號在自己欄位的最右方顯示,且加 0 ; -w :行號欄位的佔用的位元數。 範例: 範例一:列出 /etc/issue 的內容 [root@linux ~]# nl /etc/issue 1 Fedora Core release 4 (Stentz) 2 Kernel \r on an \m # 注意看,這個檔案其實有三行,第三行為空白(沒有任何字元), # 因為他是空白行,所以 nl 不會加上行號喔!如果確定要加上行號,可以這樣做: [root@linux ~]# nl -b a /etc/issue 1 Fedora Core release 4 (Stentz) 2 Kernel \r on an \m 3 # 呵呵!行號加上來囉~那麼如果要讓行號前面自動補上 0 呢?可這樣 [root@linux ~]# nl -b a -n rz /etc/issue 000001 Fedora Core release 4 (Stentz) 000002 Kernel \r on an \m 000003 # 嘿嘿!自動在自己欄位的地方補上 0 了~預設欄位是六位數,如果想要改成 3 位數? [root@linux ~]# nl -b a -n rz -w 3 /etc/issue 001 Fedora Core release 4 (Stentz) 002 Kernel \r on an \m 003 # 變成僅有 3 位數囉~nl 可以將輸出的檔案內容自動的加上行號!其結果與 cat -n 有點不太一樣, nl 可以將行號做比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能呢~
[root@linux ~]# more /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.5p # .......中間省略....... --More--(28%) <== 重點在這一行喔!仔細的給他看到上面的範例,如果 more 後面接的檔案長度大於螢幕輸出的行數時, 就會出現類似上面的圖示。重點在最後一行,最後一行會顯示出目前顯示的百分比, 而且還可以在最後一行輸入一些有用的指令喔!在 more 這個程式的運作過程中,你有幾個按鍵可以按的:
[root@linux ~]# more /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.5p # .......中間省略....... /MANPATH <== 輸入了 / 之後,游標就會自動跑到最底下一行等待輸入!如同上面的說明,輸入了 / 之後,游標就會跑到最底下一行,並且等待您的輸入, 您輸入了字串之後,嘿嘿! more 就會開始向下搜尋該字串囉~而重複搜尋同一個字串, 可以直接按下 n 即可啊!最後,不想要看了,就按下 q 即可離開 more 啦!
[root@linux ~]# less /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.5p ......中間省略........ : <== 這裡可以等待您輸入指令!less 的用法比起 more 又更加的有彈性,怎麼說呢?在 more 的時候,我們並沒有辦法向前面翻, 只能往後面看,但若使用了 less 時,呵呵!就可以使用 [pageup] [pagedown] 等按鍵的功能來往前往後翻看文件,您瞧,是不是更容易使用來觀看一個檔案的內容了呢!?
[root@linux ~]# head [-n number] 檔案 參數: -n :後面接數字,代表顯示幾行的意思 範例: [root@linux ~]# head /etc/man.config # 預設的情況中,顯示前面十行!若要顯示前 20 行,就得要這樣: [root@linux ~]# head -n 20 /etc/man.confighead 的英文意思就是『頭』啦,那麼這個東西的用法自然就是顯示出一個檔案的前幾行囉! 沒錯!就是這樣!若沒有加上 -n 這個參數時,預設只顯示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
[root@linux ~]# tail [-n number] 檔案 參數: -n :後面接數字,代表顯示幾行的意思 範例: [root@linux ~]# tail /etc/man.config # 預設的情況中,顯示最後的十行!若要顯示最後的 20 行,就得要這樣: [root@linux ~]# tail -n 20 /etc/man.config那麼有 head 自然就有 tail ( 尾巴 ) 囉!沒錯!這個 tail 的用法跟 head 的用法差不多類似,只是顯示的是後面幾行就是了!預設也是顯示十行,若要顯示非十行,就加 -n number 的參數!
例題一:假如我想要顯示 ~/.bashrc 的第 11 到第 20 行呢? 答:
|
[root@linux ~]# od [-t TYPE] 檔案 參數: -t :後面可以接各種『類型 (TYPE)』的輸出,例如: a :利用預設的字元來輸出; c :使用 ASCII 字元來輸出 d[size] :利用十進位(decimal)來輸出資料,每個整數佔用 size bytes ; f[size] :利用浮點數值(floating)來輸出資料,每個數佔用 size bytes ; o[size] :利用八進位(octal)來輸出資料,每個整數佔用 size bytes ; x[size] :利用十六進位(hexadecimal)來輸出資料,每個整數佔用 size bytes ; 範例: [root@linux ~]# 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 .....中間省略.......利用這個指令,可以將 data file 或者是 binary file 的內容資料給他讀出來喔! 雖然讀出的來數值預設是使用非文字檔,亦即是 16 進位的數值來顯示的, 不過,我們還是可以透過 -t c 的參數來將資料內的字元以 ASCII 類型的字元來顯示, 雖然對於一般使用者來說,這個指令的用處可能不大,但是對於工程師來說, 這個指令可以將 binary file 的內容作一個大致的輸出,他們可以看得出東西的啦~ ^_^
[root@linux ~]# ls -l /etc/man.config -rw-r--r-- 1 root root 4506 Apr 8 19:11 /etc/man.config [root@linux ~]# ls -l --time=atime /etc/man.config -rw-r--r-- 1 root root 4506 Jul 19 17:53 /etc/man.config [root@linux ~]# ls -l --time=ctime /etc/man.config -rw-r--r-- 1 root root 4506 Jun 25 08:28 /etc/man.config看到了嗎?在預設的情況下, ls 顯示出來的是該檔案的 mtime ,也就是這個檔案的內容上次被更動的時間。 至於我的系統是在 6/25 的時候安裝的,因此,這個檔案被產生但是狀態被更動的時間就回溯到那個時間點了! 而還記得剛剛我們使用的範例當中,有使用到這個檔案啊,所以啊,他的 atime 就會變成剛剛使用的時間了!
[root@linux ~]# touch [-acdmt] 檔案 參數: -a :僅修訂 access time; -c :僅修改時間,而不建立檔案; -d :後面可以接日期,也可以使用 --date="日期或時間" -m :僅修改 mtime ; -t :後面可以接時間,格式為[YYMMDDhhmm] 範例: 範例一:新建一個空的檔案 [root@linux ~]# cd /tmp [root@linux tmp]# touch testtouch [root@linux tmp]# ls -l testtouch -rw-r--r-- 1 root root 0 Jul 19 20:49 testtouch # 注意到,這個檔案的大小是 0 呢!在預設的狀態下,如果 touch 後面有接檔案, # 則該檔案的三個時間 (atime/ctime/mtime) 都會更新為目前的時間。若該檔案不存在, # 則會主動的建立一個新的空的檔案喔!例如上面這個例子! 範例二:將 ~/.bashrc 複製成為 bashrc,假設複製完全的屬性,檢查其日期 [root@linux tmp]# cp ~/.bashrc bashrc [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rwxr-xr-x 1 root root 395 Jul 4 11:45 bashrc <==這是 mtime -rwxr-xr-x 1 root root 395 Jul 19 20:44 bashrc <==這是 atime -rwxr-xr-x 1 root root 395 Jul 19 20:53 bashrc <==這是 ctime # 在這個案例當中,我們使用了 ; 這個指令分隔符號,他的用法我們會在 Bash shell 中提到。 # 此外, ll 是 ls -l 的命令別名,這個我們也會在 bash shell 當中再次提及, # 您目前可以簡單的想成, ll 就是 ls -l 的簡寫即可!至於 ; 則是同時下達兩個指令, # 且讓兩個指令『依序』執行的意思。上面的結果當中我們可以看到,該檔案變更的日期 # Jul 4 11:45,但是 atime 與 ctime 不一樣囉~ 範例三:修改案例二的 bashrc 檔案,將日期調整為兩天前 [root@linux tmp]# touch -d "2 days ago" bashrc [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc -rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc -rwxr-xr-x 1 root root 395 Jul 19 21:02 bashrc # 跟上個範例比較看看,本來是 19 日的變成了 17 日了 (atime/mtime)~ # 不過, ctime 並沒有跟著改變喔! 範例四:將上個範例的 bashrc 日期改為 2005/07/15 2:02 [root@linux tmp]# touch -t 0507150202 bashrc [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc -rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc -rwxr-xr-x 1 root root 395 Jul 19 21:05 bashrc # 注意看看,日期在 atime 與 mtime 都改變了,但是 ctime 則是記錄目前的時間!透過 touch 這個指令,我們可以輕易的修訂檔案的日期與時間。並且,也可以建立一個空的檔案喔! 不過,要注意的是,即使我們複製一個檔案時,複製所有的屬性,但也沒有辦法複製 ctime 這個屬性的。 ctime 可以記錄這個檔案最近的狀態 (status) 被改變的時間。無論如何,還是要告知大家, 我們平時看的檔案屬性中,比較重要的還是屬於那個 mtime 啊!我們關心的常常是這個檔案的『內容』 是什麼時候被更動的說~瞭乎?
例題二:你的系統有個一般身份使用者 dmtsai,他的群組為 users,他的家目錄在 /home/dmtsai,
你想將你的 ~/.bashrc 複製給他(假設你是 root),可以怎麼作? 答:
chown dmtsai:users ~dmtsai/bashrc |
例題三:我想在 /tmp 底下建立一個目錄,這個目錄名稱為 chap2_2_ex1 ,並且,這個目錄擁有者為 dmtsai,
群組為 users ,此外,任何人都可以進入該目錄瀏覽檔案,不過除了 dmtsai 之外,其他人都不能修改該目錄下的檔案。 答:
mkdir /tmp/chap2_2_ex1 chown -R dmtsai:users /tmp/chap2_2_ex1 chmod -R 755 /tmp/chap2_2_ex1 |
[root@linux ~]# umask 0022 [root@linux ~]# umask -S u=rwx,g=rx,o=rx查閱的方式有兩種,一種可以直接輸入 umask ,就可以看到數字型態的權限設定分數, 一種則是加入 -S (Symbolic) 這個參數,就會以符號類型的方式來顯示出權限了! 奇怪的是,怎麼 umask 會有四組數字啊?不是只有三組嗎?是沒錯啦~ 第一組是特殊權限用的,我們先不要理他,所以先看後面三組即可。
[root@linux ~]# umask 0022 [root@linux ~]# touch test1 [root@linux ~]# mkdir test2 [root@linux ~]# ll -rw-r--r-- 1 root root 0 Jul 20 00:36 test1 drwxr-xr-x 2 root root 4096 Jul 20 00:36 test2呵呵!瞧見了吧?!確定屬性是沒有錯的。好了,假如我們想要讓與使用者同群組的人也可以存取檔案呢? 也就是說,假如 dmtsai 是 users 這個群組的人,而 dmtsai 作的檔案希望讓 users 同群組的人也可以存取, 這也是常常被用在團隊開發計畫時,常常會考慮到的權限問題。在這樣的情況下, 我們的 umask 自然不能取消 group 的 w 權限,也就是說,我們希望製作出來的檔案應該是 -rw-rw-r-- 的模樣,所以囉, umask 應該是要 002 才好 (僅拿掉 others 的 w 權限)。那麼如何設定 umask 呢? 簡單的很,直接在 umask 後面輸入 002 就好了!
[root@linux ~]# umask 002 [root@linux ~]# touch test3 [root@linux ~]# mkdir test4 [root@linux ~]# ll -rw-rw-r-- 1 root root 0 Jul 20 00:41 test3 drwxrwxr-x 2 root root 4096 Jul 20 00:41 test4所以說,這個 umask 對於檔案與目錄的預設權限是很有關係的!這個概念可以用在任何伺服器上面, 尤其是未來在您架設檔案伺服器 (file server) ,舉例來說, SAMBA Server 或者是 FTP server 時, 都是很重要的觀念!這牽涉到您的使用者是否能夠將檔案進一步利用的問題喔!不要等閒視之!
例題四:假設您的 umask 為 003 ,請問該 umask 情況下,建立的檔案與目錄權限為? 答:
檔案: (-rw-rw-rw-) - (--------wx) = -rw-rw-r-- 目錄: (drwxrwxrwx) - (--------wx) = drwxrwxr-- |
[root@linux ~]# 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. 注意:這個屬性設定上面,比較常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能夠設定的喔! 範例: [root@linux ~]# cd /tmp [root@linux tmp]# touch attrtest [root@linux tmp]# chattr +i attrtest [root@linux tmp]# rm attrtest rm: remove write-protected regular empty file `attrtest'? y rm: cannot remove `attrtest': Operation not permitted # 看到了嗎?呼呼!連 root 也沒有辦法將這個檔案刪除呢!趕緊解除設定! [root@linux tmp]# chattr -i attrtest這這個指令是重要的,尤其是在系統的安全性上面!由於這些屬性是隱藏的性質,所以需要以 lsattr 才能看到該屬性呦!其中,個人認為最重要的當屬 +i 這個屬性了,因為他可以讓一個檔案無法被更動,對於需要強烈的系統安全的人來說, 真是相當的重要的!裡頭還有相當多的屬性是需要 root 才能設定的呢!此外,如果是 log file 這種的登錄檔,就更需要 +a 這個可以增加,但是不能修改舊有的資料與刪除的參數了! 怎樣?很棒吧!未來提到登錄檔的認知時,我們再來聊一聊如何設定他吧!
[root@linux ~]# lsattr [-aR] 檔案或目錄 參數: -a :將隱藏檔的屬性也秀出來; -R :連同子目錄的資料也一併列出來! 範例: [root@linux tmp]# chattr +aij attrtest [root@linux tmp]# lsattr ----ia---j--- ./attrtest使用 chattr 設定後,可以利用 lsattr 來查閱隱藏的屬性。不過, 這兩個指令在使用上必須要特別小心,否則會造成很大的困擾。例如:某天你心情好,突然將 /etc/shadow 這個重要的密碼記錄檔案給他設定成為具有 i 的屬性,那麼過了若干天之後, 你突然要新增使用者,卻一直無法新增!別懷疑,趕快去將 i 的屬性拿掉吧!
[root@linux ~]# ls -ld /tmp ; ls -l /usr/bin/passwd drwxrwxrwt 5 root root 4096 Jul 20 10:00 /tmp -r-s--x--x 1 root root 18840 Mar 7 18:06 /usr/bin/passwd不是只有 rwx 嗎?還有其他的特殊權限啊?啊.....頭又開始昏了~ @_@ 呵呵,不要擔心啦,我們這裡先不談這兩個權限,只是先介紹一下而已。 因為要瞭解這幾個特殊的權限,必須要先具有帳號的 ID 概念,以及程式的程序 (process) 概念後, 才能夠進一步的瞭解這個特殊權限所代表的意義。
[root@linux ~]# cd /tmp [root@linux tmp]# touch test [root@linux tmp]# chmod 4755 test; ls -l test -rwsr-xr-x 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 6755 test; ls -l test -rwsr-sr-x 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 1755 test; ls -l test -rwxr-xr-t 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 7666 test; ls -l test -rwSrwSrwT 1 root root 0 Jul 20 11:27 test # 這個例子就要特別小心啦!怎麼會出現大寫的 S 與 T 呢?不都是小寫的嗎? # 因為 s 與 t 都是取代 x 這個參數的,但是你有沒有發現阿,我們是下達 # 7666 喔!也就是說, user, group 以及 others 都沒有 x 這個可執行的標誌 # ( 因為 666 嘛! ),所以,這個 S, T 代表的就是『空的』啦!怎麼說? # SUID 是表示『該檔案在執行的時候,具有檔案擁有者的權限』,但是檔案 # 擁有者都無法執行了,哪裡來的權限給其他人使用?當然就是空的啦! ^_^
[root@linux ~]# file ~/.bashrc /root/.bashrc: ASCII text <== 告訴我們是 ASCII 的純文字檔啊! [root@linux ~]# file /usr/bin/passwd /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped # 資料可多了~包括這個日 Set UID 2的檔案,使用 shared libs, # 適合於 Intel 的 386 以上機種的硬體,很清楚吧! [root@linux ~]# file /var/lib/slocate/slocate.db /var/lib/slocate/slocate.db: data <== 這是 data 檔案!透過這個指令,我們可以簡單的先判斷這個檔案的格式為何喔!
[root@linux ~]# which [-a] command 參數: -a :將所有可以找到的指令均列出,而不止第一個被找到的指令名稱 範例: [root@linux ~]# which passwd /usr/bin/passwd [root@linux ~]# which traceroute -a /usr/sbin/traceroute /bin/traceroute這個指令是根據『PATH』這個環境變數所規範的路徑,去搜尋『執行檔』的檔名~ 所以,重點是找出『執行檔』而已!且 which 後面接的是『完整檔名』喔!若加上 -a 參數,則可以列出所有的可以找到的同名執行檔,而非僅顯示第一個而已!
[root@linux ~]# whereis [-bmsu] 檔案或目錄名 參數: -b :只找 binary 的檔案 -m :只找在說明檔 manual 路徑下的檔案 -s :只找 source 來源檔案 -u :沒有說明檔的檔案! 範例: [root@linux ~]# whereis passwd passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz # 任何與 passwd 有關的檔名都會被列出來~ [root@linux ~]# whereis -b passwd passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD [root@linux ~]# whereis -m passwd passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz等一下我們會提到 find 這個搜尋指令, find 是很強大的搜尋指令,但時間花用的很大! (因為 find 是直接搜尋硬碟,為如果你的硬碟比較老舊的話,嘿嘿!有的等的!) 這個時候 whereis 就相當的好用了!另外, whereis 可以加入參數來找尋相關的資料, 例如如果你是要找可執行檔 ( binary ) 那麼加上 -b 就可以啦!例如上面的範例針對 passwd 這支程式來說明!如果不加任何參數的話,那麼就將所有的資料列出來囉!
[root@linux ~]# locate filename [root@linux ~]# locate passwd /lib/security/pam_passwdqc.so /lib/security/pam_unix_passwd.so /usr/lib/kde3/kded_kpasswdserver.so /usr/lib/kde3/kded_kpasswdserver.la .......中間省略.......這個 locate 的使用更簡單,直接在後面輸入『檔案的部分名稱』後,就能夠得到結果。 舉上面的例子來說,我輸入 locate passwd ,那麼在完整檔名 (包含路徑名稱) 當中,只要有 passwd 在其中, 就會被顯示出來的!這也是個很方便好用的指令,如果您忘記某個檔案的完整檔名時~~
[root@linux ~]# find [PATH] [option] [action] 參數: 1. 與時間有關的參數: -atime n :n 為數字,意義為在 n 天之前的『一天之內』被 access 過的檔案; -ctime n :n 為數字,意義為在 n 天之前的『一天之內』被 change 過狀態的檔案; -mtime n :n 為數字,意義為在 n 天之前的『一天之內』被 modification 過的檔案; -newer file :file 為一個存在的檔案,意思是說,只要檔案比 file 還要新, 就會被列出來~ 2. 與使用者或群組名稱有關的參數: -uid n :n 為數字,這個數字是使用者的帳號 ID,亦即 UID ,這個 UID 是記錄在 /etc/passwd 裡面與帳號名稱對應的數字。這方面我們會在第四篇介紹。 -gid n :n 為數字,這個數字是群組名稱的 ID,亦即 GID,這個 GID 記錄在 /etc/group,相關的介紹我們會第四篇說明~ -user name :name 為使用者帳號名稱喔!例如 dmtsai -group name:name 為群組名稱喔,例如 users ; -nouser :尋找檔案的擁有者不存在 /etc/passwd 的人! -nogroup :尋找檔案的擁有群組不存在於 /etc/group 的檔案! 當您自行安裝軟體時,很可能該軟體的屬性當中並沒有檔案擁有者, 這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。 3. 與檔案權限及名稱有關的參數: -name filename:搜尋檔案名稱為 filename 的檔案; -size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的檔案。這個 SIZE 的規格有: c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 還要大的檔案,就是『 -size +50k 』 -type TYPE :搜尋檔案的類型為 TYPE 的,類型主要有:一般正規檔案 (f), 裝置檔案 (b, c), 目錄 (d), 連結檔 (l), socket (s), 及 FIFO (p) 等屬性。 -perm mode :搜尋檔案屬性『剛好等於』 mode 的檔案,這個 mode 為類似 chmod 的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 ! -perm -mode :搜尋檔案屬性『必須要全部囊括 mode 的屬性』的檔案,舉例來說, 我們要搜尋 -rwxr--r-- ,亦即 0744 的檔案,使用 -perm -0744, 當一個檔案的屬性為 -rwsr-xr-x ,亦即 4755 時,也會被列出來, 因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。 -perm +mode :搜尋檔案屬性『包含任一 mode 的屬性』的檔案,舉例來說,我們搜尋 -rwxr-xr-x ,亦即 -perm +755 時,但一個檔案屬性為 -rw------- 也會被列出來,因為他有 -rw.... 的屬性存在! 4. 額外可進行的動作: -exec command :command 為其他指令,-exec 後面可再接額外的指令來處理搜尋到 的結果。 -print :將結果列印到螢幕上,這個動作是預設動作! 範例: 範例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的檔案列出 [root@linux ~]# find / -mtime 0 # 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前, # 有變動過內容的檔案都會被列出來!那如果是三天前的 24 小時內? # find / -mtime 3 ,意思是說今天之前的 3*24 ~ 4*24 小時之間 # 有變動過的檔案都被列出的意思!同時 -atime 與 -ctime 的用法相同。 範例二:尋找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出 [root@linux ~]# find /etc -newer /etc/passwd # -newer 用在分辨兩個檔案之間的新舊關係是很有用的! 範例三:搜尋 /home 底下屬於 dmtsai 的檔案 [root@linux ~]# find /home -user dmtsai # 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時, # 就可以利用這個指令將屬於某個使用者的所有檔案都找出來喔! 範例四:搜尋系統中不屬於任何人的檔案 [root@linux ~]# find / -nouser # 透過這個指令,可以輕易的就找出那些不太正常的檔案。 # 如果有找到不屬於系統任何人的檔案時,不要太緊張, # 那有時候是正常的~尤其是您曾經以原始碼自行編譯軟體時。 範例五:找出檔名為 passwd 這個檔案 [root@linux ~]# find / -name passwd # 利用這個 -name 可以搜尋檔名啊! 範例六:搜尋檔案屬性為 f (一般檔案) 的檔案 [root@linux ~]# find /home -type f # 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的檔案, # 例如 socket 與 FIFO 檔案,可以用 find /var -type p 或 -type s 來找! 範例七:搜尋檔案當中含有 SGID/SUID/SBIT 的屬性 [root@linux ~]# find / -perm +7000 # 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出, # 所以當然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三個權限, # 因此,就是 +7000 ~瞭乎? 範例八:將上個範例找到的檔案使用 ls -l 列出來~ [root@linux ~]# find / -perm +7000 -exec ls -l {} \; # 注意到,那個 -exec 後面的 ls -l 就是額外的指令, # 而那個 {} 代表的是『由 find 找到的內容』的意思~所以, -exec ls -l {} # 就是將前面找到的那些檔案以 ls -l 列出長的資料!至於 \; 則是表示 # -exec 的指令到此為止的意思~意思是說,整個指令其實只有在 # -exec (裡面就是指令下達) \; # 也就是說,-exec 最後一定要以 \; 結束才行!這樣瞭解了嗎?! 範例九:找出系統中,大於 1MB 的檔案 [root@linux ~]# find / -size +1000k # 雖然在 man page 提到可以使用 M 與 G 分別代表 MB 與 GB, # 不過,俺卻試不出來這個功能~所以,目前應該是僅支援到 c 與 k 吧!如果你要尋找一個檔案的話,那麼使用 find 會是一個不錯的主意! 他可以根據不同的參數來給予檔案的搜尋功能!例如你要尋找一個檔名為 httpd.conf 的檔案,你知道他應該是在 /etc 底下,那麼就可以使用『 find /etc -name httpd.conf 』嚕! 那如果你記得有一個檔案檔名包含了 httpd ,但是不知道全名怎辦?!呵呵,就用萬用字元 * 吧,如上以:『 find /etc -name '*httpd*' 』就可將檔名含有 httpd 的檔案都列出來囉!不過,由於 find 在尋找資料的時後相當的耗硬碟!所以沒事情不要使用 find 啦!有更棒的指令可以取代呦!那就是 whereis 與 locate 囉!!