Linux 查找文件的正確方式


Linux 系統中查找文件的命令有 whichwhereislocatefind 等,本文對這四條命令進行簡單的介紹、列舉了一些簡單的使用方式。

which

在 PATH 變量中定義的全部路徑中查找可執行文件或腳本

which 命令有兩個重要參數:

  • -all, -a 默認情況下,which 命令會在匹配到第一個結果后結束運行,添加該參數可以讓其搜索所有路徑。

  • -read-alias, -i 將輸入視為別名搜索。Linux 系統中通常會使用 alias 設置諸多別名來簡寫命令,例如 Centos 中的 ll 實際是 ls -l ,而 whichalias | /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 會實際的掃描磁盤,所以速度會明顯小於前三個。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM