Find locate whereis which区别

檔案的搜尋:

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


--------------------------------------------------------------------------------

which (尋找『執行檔』)
[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 參數,則可以列出所有的可以找到的同名執行檔,而非僅顯示第一個而已!



--------------------------------------------------------------------------------

whereis (尋找特定檔案)
[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 這支程式來說明!如果不加任何參數的話,那麼就將所有的資料

列出來囉!

那麼 whereis 到底是使用什麼咚咚呢?為何搜尋的速度會比 find 快這麼多?! 其實那也沒有什麼!這是因為 Linux 系統會將系統內的所有

檔案都記錄在一個資料庫檔案裡面, 而當使用 whereis 或者是底下要說的 locate 時,都會以此資料庫檔案的內容為準, 因此,有的時後你

還會發現使用這兩個執行檔時,會找到已經被殺掉的檔案! 而且也找不到最新的剛剛建立的檔案呢! 這就是因為這兩個指令是由資料庫當中

的結果去搜尋檔案的所在啊!

另外,基本上 Linux 每天會針對 Linux 主機上所有檔案的所在進行搜尋資料庫的更新, 更新的程式就是 updatedb ,你可以在 FC4 系統的

/etc/cron.daily/slocate.cron 這個檔案找到相關的機制呦!當然,也可以直接使用 /usr/bin/updatedb 來更新資料庫檔案呢!

--------------------------------------------------------------------------------

locate
[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 在其中, 就會被顯示出來的!這也是個很方便好用的指令,如果您忘記某個檔案的完整檔

名時~~

但是,這個東西還是有使用上的限制呦!為什麼呢?您會發現使用 locate 來尋找資料的時候特別的快, 這是因為 locate 尋找的資料是由『

已建立的資料庫 /var/lib/slocate/』 裡面的資料所搜尋到的,所以不用直接在去硬碟當中存取資料,呵呵!當然是很快速囉! 那麼有什麼

限制呢?就是因為他是經由資料庫來搜尋的,而資料庫的建立預設是在每天執行一次 (每個 distribution 都不同, FC4 是每天更新資料庫一

次!),所以當您新建立起來的檔案, 卻還在資料庫更新之前搜尋該檔案,那麼 locate 會告訴您『找不到!』呵呵!因為必須要更新資料庫

呀!

那麼我到底要建立哪些資料庫呢?是否全部都要建立?似乎不需要,這個時候, 你可以自己選擇需要建立檔案資料庫的目錄呢!你可以在

/etc/updatedb.conf 這個檔案內設定。 建議您使用預設值就好了,不過,在 /etc/updatedb.conf 裡面,請把『DAILY_UPDATE=no』改成

『DAILY_UPDATE=yes』就好了。至於修改的方法等到我們第三章提完 vi 後,您就會曉得囉~ 當然啦,也可以自行手動執行 updatedb 即可!



--------------------------------------------------------------------------------

find
[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,
      當一個檔案的屬性為 -rwxr-xr-x ,亦即 4755 時,也會被列出來,
      因為 -rwxr-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 囉!!

但,不管怎麼說, find 在找尋特殊的檔案屬性,以及特殊的檔案權限 (SUID/SGID等等) 時, 是相當有用的工具程式之一!重要重要!

你可能感兴趣的:(linux,socket,unix,Security,F#)