Linux 系統中查詢檔案的命令有 which
、whereis
、locate
和 find
等,本文對這四條命令進行簡單的介紹、列舉了一些簡單的使用方式。
which
在 PATH 變數中定義的全部路徑中查詢可執行檔案或指令碼。
which
命令有兩個重要引數:
-
-all, -a
預設情況下,which
命令會在匹配到第一個結果後結束執行,新增該引數可以讓其搜尋所有路徑。 -
-read-alias, -i
將輸入視為別名搜尋。Linux 系統中通常會使用 alias 設定諸多別名來簡寫命令,例如 Centos 中的ll
實際是ls -l
,而which
是alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde
。# Centos # 以絕對路徑呼叫 which,這樣就不會受到 Centos 預設的幾個引數影響 # 返回結果說明找不到 ll 命令 $ /usr/bin/which ll /usr/bin/which: no ll in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) # 直接輸入 which 時實際效果為帶有“預設引數”的 # 返回結果說明 ll 是 ls -l 的別名, $ which ll alias ll='ls -l --color=auto' /usr/bin/ls
which ll
相當於alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde ll
,返回結果第一行是 alias 輸出的ll
別名設定情況,第二行則是ls
的實際位置。
which
的其他幾個引數如下:
--tty-only
:盡在終端呼叫的情況下附帶右側新增的引數,其他情況下不接收右側其他引數(此處的引數值--show-dot
、--show-tilde
此類,輸入的待查詢命令仍然會接收),通過這個命令可以保證 Shell 指令碼中的which
命令正確執行。--show-dot
:輸出以 "." 符號開頭的目錄。Linux 中 "." 符號開頭的目錄是約定的隱藏資料夾,沒有該引數時會忽略這些目錄。--show-tilde
:將使用者家目錄替換成 "~" 符號輸出。Linux 中 "~" 符號是登入使用者家目錄的縮寫,如果登入使用者名稱為 cncsl,則 "~" 指 "/home/cncsl" 目錄。當使用 root 賬號登入時該引數無效。
whereis
查詢指定命令的可執行檔案、原始碼和手冊的位置。
$ whereis vim
vim: /usr/bin/vim /usr/share/vim /usr/share/man/man1/vim.1.gz
可以看出,vim
的可執行程式位於 /usr/bin/vim
,手冊位於 /usr/share/vim
和 /share/man/man1/vim.1.gz
目錄。
-
-b
、-m
和-s
分別用於指定僅查詢可執行檔案、手冊和原始碼。 -
-B
、-M
和-S
命令用於指定查詢路徑。 -
-u
引數的描述直譯為 僅查詢有異常情況的命令。所謂的異常情況是指,某個命令的相關型別檔案不止恰好一份(一份都沒有或多於一份)。例如:-
ls
命令具有兩份手冊:$ whereis -m -u ls ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
-
Linux 系統中有很多個與 python 相關的可執行檔案:
$ whereis -b -u python python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7
-
locate
在文件和目錄名稱的資料庫中查詢指定檔案。Linux 系統會定期自動掃描磁碟來維護一個記錄磁碟資料的資料庫,而 locate
命令使用的資料庫是 /var/lib/mlocate/mlocate.db。
$ ls -hl /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 2.7M Feb 4 03:42 /var/lib/mlocate/mlocate.db
可以看出當前 mlocate.db 檔案共記錄了 2.7M 的資料。
--count, -c
:不輸出具體的檔案路徑資訊,僅輸出查詢到的數量。--ignore-case, -i
:查詢時忽略大小寫--limit, -l, -n LIMIT
:限定輸出的檔案數量為 LIMIT--regexp,-r REGEXP
:使用 REGEXP 指定的正規表示式匹配。
# 統計有多少PNG格式的影像檔案
$ locate -c png
# 統計有多少 readme 檔案(根據編寫者的習慣,readme 檔案可能名為 README、ReadMe等)
$ locate -c -i readme
# 輸出十個 .gz 歸檔檔案的路徑
$ locate -l 10 *.gz
# 檢視 tomcat 2021年1月的日誌
$ locate -r tomcat.2021-01-[0-3][0-9].log
由於 locate
命令是從資料庫查詢檔案,新建立的檔案可能由於未被記錄到資料庫中而無法查詢到,這種時候需要使用 updatedb
命令手動更新資料庫。
find
在一個目錄層級中查詢檔案。
find
命令功能強大,可根據多種條件查詢檔案,隨後進行自定義的操作,格式如下:
find [path...] [expression]
-
查詢當前目錄下所有的 markdown 文件:
$ find . -name "*.log"
-
查詢使用者視訊資料夾中大於 100M 的檔案:
$ find ~/Videos/ -size +100M
-
查詢使用者音樂資料夾中過去七天訪問過的檔案:
$ find ~/Music/ -atime -7
-
查詢系統中、三個月之前建立的、一個月之內沒有訪問過、大於 30M 的日誌檔案,並刪除:
find / -ctime +90 -atime +30 -size +1M -name "*.log" -delete
find
會實際的掃描磁碟,所以速度會明顯小於前三個。