Linux command – which , find , whereis , (s)locate

Loading

which , find , whereis , (s)locate 都是用來尋找檔案的,差別如下:

  1. which 會利用PATH參數來尋找所有位於PATH目錄下可執行檔案
  2. find 會根據所指定的範圍進行搜索
  3. whereis 不僅能尋找可執行檔案,還可以尋找manpage以及原始檔
  4. (s)locate 所搜尋的是updatedb所製成的資料庫

which

[root@benjr root]# which traceroute
/usr/sbin/traceroute

若加上 -a 參數,則可以列出所有的可以找到的同名執行檔,而非僅顯示第一個而已!

[root@benjr root]# which traceroute
/usr/sbin/traceroute
/bin/traceroute

find paths expression

[root@benjr root]# find / -name “passwd"

依名稱來搜尋檔案,可以使用 *,? 等字元為搜尋目標.

依檔案的擁有者不屬於任何使用者(User owner 為數字或不存在於 /etc/passwd 檔案中)來搜尋,另外針對group還有 -nogroup 可用.

[root@benjr root]# find /home -nouser
[root@benjr root]# find /home -nogroup

除了可以單獨使用還可以搭配來使用。 使用參數 -o(-or) 還有 -a(-and) 還有 !(-not)

[root@benjr root]# find /home -nouser -o -nogroup

這樣就可以找檔案的擁有者不屬於任何使用者或者不屬於任何群組.我們還可以依據檔案的 rwx 屬性來尋找.

[root@benjr root]# find / -perm 644

找出 file permition 為 644(rw-r–r–) 的檔案,另外還可以用 -644(只比較644(rw-r–r–)不管其他bit為何),+644(只要其中一個bit相符合既可)

[root@benjr root]# find / -perm -644
[root@benjr root]# find / -perm +644

找出檔案屬性有 SUID 者. 還可用-4000(SUID) -2000 (SGID) -1000(sTicky Bit) 等

[root@benjr root]# find / -perm -4000
[root@benjr root]# find / -perm -2000
[root@benjr root]# find / -perm -1000

找出檔案大於 100M的,100000單位為 kbyte. “+” 代表大於100000k, “-” 代表小於 100000k.

[root@benjr root]# find / -size +100000

找出屬性為檔案 f (file) ,還可針對目錄 d (directory) ,連結 l (softlink)來尋找.

[root@benjr root]# find / -type f
[root@benjr root]# find / -type d
[root@benjr root]# find / -type l

參數 -exec 將之前的結果轉向 ls -l 來處理 , {} 表示之前的結果 , \; 結束.

[root@benjr root]# find . -nouser -exec ls -l {} \;

計算目錄中各個子目錄分別的容量

[root@benjr root]# find /home -maxdepth 1 -type d -exec du -sh {} \;
40M /home
20M /home/user1
20M /home/user2

至於要找檔案內容的除了要使用 find 還要配合 grep -l(-l :files with matches),如果你要找 /root 目錄下所有的檔案內容包含 Ben 字串的檔案.可以用下面方法來實現.

[root@benjr root]# find /root/* -exec grep -l Ben {} \;

至於 find 的 -exec 參數請參考上面的範例,grep的參數 -l 為只會列出含有此特定字串的檔案名稱.

在指定的目錄內,將檔案修改成 664 (rw-r–r–)

# find /path/to/site/ -type f -exec chmod 664 {} \;

在指定的目錄內,將目錄修改成 775 (rwxrwxr-x)

#find /path/to/site/ -type d -exec chmod 775 {} \;

更多關於 find 的使用請參考 https://benjr.tw/95124

whereis [options] files

whereis 不僅能尋找可執行檔案,還可以尋找manpage以及原始檔
-b 只找可執行檔
-f ??作用不明
-m 只搜尋manpages
-s 只搜尋source code
-u ??作用不明
-B ??作用不明
-M ??作用不明
-S ??作用不明

[root@benjr root]# whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz

locate patterns

locate or slocate 所搜尋的是updatedb所製成的資料庫,locate 為slocate 的soft link,locate 命令必須擁有最新的資料庫才能正常運作,資料庫存放在 /var/lib/mlocate/mlocate.db,資料庫每天會跟新一次,由 cron daemon ( /etc/cron.daily/mlocate.cron ) 每天 4:02 自動運作,定義在 /etc/crontab ,或者你可以用指令來手動更新他的資料庫.

在 /etc/updatedb.conf 定義了以下幾種格式 “PRUNEFS” 或是目錄 “PRUNEPATHS” 是不做更新的動作.
PRUNEFS = “auto afs gfs gfs2 iso9660 sfs udf”
PRUNEPATHS = “/afs /media /net /sfs /tmp /udev /var/spool/cups /var/spool/squid /var/tmp”

我們自己在手動更新時也可以加入參數 -e directories 所指定的目錄將會排除在資料庫更新之外.
#updatedb -e directories

[root@benjr root]# updatedb -e “/tmp,/var/tmp,/usr/tmp,/afs,/net,/proc"

更新資料庫,但將臨時性的檔案排除在外

沒有解決問題,試試搜尋本站其他內容

One thought on “Linux command – which , find , whereis , (s)locate

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料