which , find , whereis , (s)locate 都是用來尋找檔案的,差別如下:
- which 會利用PATH參數來尋找所有位於PATH目錄下可執行檔案
- find 會根據所指定的範圍進行搜索
- whereis 不僅能尋找可執行檔案,還可以尋找manpage以及原始檔
- (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”