0、概述
* `which`:在PATH變量指定的路徑中,搜索與指定名字匹配的系統命令的位置,并且返回第一個搜索結果。 * `whereis`:搜索與指定名字匹配的二進制文件、源文件和幫助手冊文件所在的路徑。二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。如果省略參數,則返回所有信息。在數據庫中查詢。 * `locate`:locate 會給出所有與`*filename*` 相匹配的文件的路徑。在數據庫中查詢。 * `find`:實際搜尋硬盤查詢文件名稱。 * `whatis`:展示命令手冊頁面描述里的內容。使用 `mkwhatis` 命令可將當前系統上所有的幫助手冊及與之對應的關鍵字創建為一個數據庫。
1、which?
語法:which ??[-a] ??cmdname1 cmdname2 ......
作用:locate a command,從環境變量PATH中,定位/返回與指定名字相匹配的 命令/可執行文件 所在的路徑
原理:執行which命令時,which會在當前環境變量PATH中依次尋找能夠匹配所找命令名字的可執行文件名,不加-a選項,返回第一個匹配的可執行文件的路徑,否則依次返回滿足條件的所有可執行文件的路徑名。
適用場合:一般用于查找 命令/可執行文件 所在的路徑。有時候可能在多個路徑下存在相同的命令,該命令可用于查找當前所執行的命令到底是哪一個位置處的命令。?
[root@redhat ~]# which passwd
/usr/bin/passwd
2、whereis?
語法:?whereis [-bmsu] 文件或者目錄名稱?
參數說明:?
- -b : 只找二進制文件?
- -m: 只找在說明文件manual路徑下的文件?
- -s : 只找source源文件?
- -u : 沒有說明文檔的文件?
作用:定位/返回與指定名字匹配的二進制文件、源文件和幫助手冊文件所在的路徑。
原理:whereis命令首先會去掉filename中的前綴空格和以.開頭的任何字符,然后再在數據庫(var/lib/slocate/slocate.db)中查找與上述處理后的filename相匹配的二進制文件、源文件和幫助手冊文件,使用之前可以使用updatedb命令手動更新數據庫。
適用場合:二進制文件、源文件和幫助手冊文件路徑的查找。
例如:?
# 將和passwd文件相關的文件都查找出來
[fenglepeng@centos]# whereis passwd?
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz? # 只將二進制文件查找出來
[fenglepeng@centos]# whereis -b passwd?
passwd: /usr/bin/passwd /etc/passwd?
和find相比,whereis查找的速度非常快,這是因為linux系統會將系統內的所有文件都記錄在一個數據庫文件中,當使用whereis和locate時,會從數據庫中查找數據,而不是像find命令那樣,通過遍歷硬盤來查找,效率自然會很高。?
但是該數據庫文件并不是實時更新,默認情況下每天更新一次,因此,我們在用whereis和locate查找文件時,有時會找到已經被刪除的數據,或者剛剛建立文件,卻無法查找到,原因就是因為數據庫文件沒有被更新。?(使用updatedb命令進行更新)
3、 locate?
語法:?locate 文件或者目錄名稱?
作用:同whereis指令一樣,也是從數據庫建立的索引中查找,不同的是該命令查找所有部分匹配的文件,使用之前可以使用updatedb命令手動更新數據庫。
原理:默認情況下(當filename中不包含通配符*),locate會給出所有與*filename*相匹配的文件的路徑。
適用場合:沒有文件類型性質的模糊查找(你只記得某個文件的部分名稱)。
個人感覺locate和whereis差不多,locate比較適合與數據庫一起配合著用,locate命令可以在搜尋數據庫時快速找到檔案
[fenglepeng@centos]# locate passwd
/lib/security/pam_unix_passwd.so
/lib/security/pam_passwdqc.so
/usr/include/rpcsvc/yppasswd.x
/usr/include/rpcsvc/yppasswd.h
/usr/lib/perl5/5.8.5/i386-linux-thread-multi/rpcsvc/yppasswd.ph
/usr/lib/kde3/kded_kpasswdserver.la
/usr/lib/kde3/kded_kpasswdserver.so
/usr/bin/vncpasswd
/usr/bin/userpasswd
/usr/bin/yppasswd
4、 find?
語法:?find 路徑 參數?
參數說明:?
- 時間查找參數:?
- -atime n :將n*24小時內存取過的的文件列出來?
- -ctime n :將n*24小時內改變、新增的文件或者目錄列出來?
- -mtime n :將n*24小時內修改過的文件或者目錄列出來?
- -newer file :把比file還要新的文件列出來?
- 名稱查找參數:?
- -gid n?????? :尋找群組ID為n的文件?
- -group name? :尋找群組名稱為name的文件?
- -uid n?????? :尋找擁有者ID為n的文件?
- -user name?? :尋找用戶者名稱為name的文件?
- -name file?? :尋找文件名為file的文件(可以使用通配符)?
作用:從當前目錄遞歸的搜索文件。
原理:遍歷當前工作目錄及其子目錄,find命令是在硬盤上遍歷查找,非常耗硬盤資源,查找效率相比whereis和locate較低。
適用場合:能用which、whereis和locate的時候盡量不要用find。
[fenglepeng@centos]# find / -name zgz
/home/zgz
/home/zgz/zgz
/home/weblogic/bea/user_projects/domains/zgz?
總結
find,遍歷硬盤查找,通常使用 find / -name Filename。耗內存。locate和whereis是根據數據庫查找,無法實時查找文件。有可能找到剛才刪除的文件和無法找到新增的文件。which根據path找可執行文件。whereis 可以用來找相關安裝路徑和二進制文件,可執行文件。
當我們用whereis和locate無法查找到我們需要的文件時,可以使用find,但是find是在硬盤上遍歷查 找,因此非常消耗硬盤的資源,而且效率也非常低,因此建議大家優先使用whereis和locate。?