<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 文件搜索神器 find 實戰(zhàn)詳解,建議收藏!

          共 6443字,需瀏覽 13分鐘

           ·

          2021-05-11 01:33

          大家好,我是肖邦,這是我的第 10 篇原創(chuàng)文章。

          在 Linux 系統(tǒng)使用中,作為一個管理員,我希望能查找系統(tǒng)中所有的大小超過 200M 文件,查看近 7 天系統(tǒng)中哪些文件被修改過,找出所有子目錄中的可執(zhí)行文件,這些任務(wù)需求 find 命令都可以輕松勝任。

          在 Linux 系統(tǒng)文件中常用的屬性可以分為以下內(nèi)容:名稱、大小、權(quán)限、屬主、修改時間、訪問時間等,find 命令可以按照指定的屬性為條件進行查找。

          廢話不多,直接開干,下邊進入案例實戰(zhàn)。

          案例實戰(zhàn)

          (一)按文件名稱查找

          按照文件名稱查找是 find 最常見的用法,需要注意的是,搜索的文件名必須完全匹配,才能找到對應(yīng)的文件。

          1. 查找當(dāng)前目錄下所有 go 文件

          $ find . -name "*.go"

          2. 在 etc 目錄下,查找大寫字母開頭的 txt 文件

          $ find /etc -name "[A-Z]*.txt" -print

          3. 在當(dāng)前目錄下查找不是 out 開頭的 txt 文件

          $ find . -name "out*" -prune -o -name "*.txt" -print

          4. 在當(dāng)前目錄除 git 子目錄外查找 txt 文件

          $ find . -path "./git" -prune -o -name "*.txt" -print

          5. 找出某個文件的所有硬鏈接,ls 命令 -i 選項可以查看文件的 inode 號

          $ ls -i 1.txt
          138956 1.txt
          $ find . -num 138956

          搜索文件時使用 -iname 參數(shù)可以忽略文件名稱大小寫

          (二)按文件類型查找

          1. 在當(dāng)前目錄下,查找軟連接文件

          $ find . -type l -print

          2. 在當(dāng)前目錄下,查找 log 結(jié)尾的普通文件,f 表示普通文件類型

          $ find . -type f -name "*.log"

          (三)按文件大小查找

          1. 查找小于 64k 的文件

          $ find . -size -64k -print

          2. 查找大小超過 200M 的文件

          $ find . -size +200M -type f -print

          (四)按時間查找

          1. 查找 2 天內(nèi)被修改過的文件

          $ find . -mtime -2 -type f -print

          2. 查找 2 天前被更改過的文件,-mtime 表示內(nèi)容修改時間

          $ find . -mtime +2 -type f -print

          3. 查找一天內(nèi)被訪問的文件,-atime 表示訪問時間

          $ find . -atime -1 -type f -print

          4. 查找一天內(nèi)狀態(tài)被改變的文件,-ctime 表示元數(shù)據(jù)被變化時間

          $ find . -ctime -1 -type f -print

          5. 查找比 chopin.txt 新的文件

          $ find . -newer "chopin.txt" -type f -print
          $ find . ! -newer "chopin.txt" -type f -print # 舊

          (五)根據(jù)權(quán)限查找

          1. 查找當(dāng)前目錄權(quán)限為 644 的文件

          $ find . -type f -perm 644

          2. 查找 etc 目錄下至少有一個用戶有寫權(quán)限的文件

          $ find /etc -type f -perm /222

          3. 查找 etc 目錄下所有用戶都有執(zhí)行權(quán)限的文件

          $ find /etc -perm -111 -ls

          (六)組合條件

          1. 查找當(dāng)前目錄下屬于 chopin 用戶的普通文件,-a 可以省略

          $ find . -type f -a -user chopin -print

          2. 查找當(dāng)前目錄下大于 2M 或 2 天前被修過的文件

          $ find . -size +2M -o -mtime +2 -print

          3. 查找當(dāng)前目錄下不是普通文件

          $ find . -not -type f
          $ find . ! -type f

          4. 查找非空文件

          $ find . ! -empty

          (七)處理動作

          find 根據(jù)上述各種條件查找后,支持執(zhí)行相關(guān)的處理動作,可以讓我們的更方便和靈活,而不只是打印出來

          1. -print 默認為打印,可省略

          $ find . -name "*.log" -print
          $ find . -name "*.log" # 等價

          2. -ls 以 ls 長文件的格式形式輸出

          $ find . -name "*.txt" -ls
          138957      4 -rw-r--r--   1 root     root           16 Jan 24 23:20 ./a.txt
          138959      4 -rw-r--r--   1 root     root          172 Jan 24 13:06 ./T.txt
          138956      4 -rw-r--r--   1 root     root           27 Jan 24 23:28 ./1.txt

          3. -delete 刪除查找到的文件

          $ find . -size +100M -delete

          4. -exec 將查找到的文件傳遞給 command 命令。下邊例子是將查找到的文件傳遞給了 ls 命令,同理我們可以傳遞給任何一個 Linux 命令,功能十分強大,也很靈活。

          $ find . -name "*.txt" -exec ls -lh {} \;
          -rw-r--r-- 1 root root 16 Jan 24 23:20 ./a.txt
          -rw-r--r-- 1 root root 172 Jan 24 13:06 ./T.txt
          -rw-r--r-- 1 root root 27 Jan 24 23:28 ./1.txt

          5. -ok-exec 功能一樣,只是操作時會提示用戶確認,僅此而已。當(dāng)然,在生產(chǎn)環(huán)境上,我們還是推薦使用 ok

          (八)經(jīng)典案例

          如果存在一個名稱亂碼的文件,想要刪除它,該怎么辦?即使我們復(fù)制亂碼名稱到命令行,很有可能終端不能正確識別。不用擔(dān)心,下邊來展示下 find 是如何優(yōu)雅的解決問題的。

          $ ls  -i
          138957 a.txt  138959 T.txt  132395 ???.txt

          $ find . -inum 132395 -exec rm {} \;

          命令中,-inum 指定的是文件的 inode 號,它是系統(tǒng)中每個文件對應(yīng)的唯一編號,find 通過編號找到后,執(zhí)行刪除操作。

          總結(jié)歸納

          find 命令是 Linux 命令中最有用的命令之一,它的功能非常強大,且語法復(fù)雜。其實我們不一定需要了解它的所有細節(jié),掌握上述實戰(zhàn)案例中的常見用法,足夠滿足日常工作中的大部分需求。

          下邊我們一起來總結(jié)下 find 命令常見用法,加深對 find 使用方法的理解。

          命令格式

          find path -option [-exec ...]

          按文件名查找

          • -name:按照文件名稱查找,準(zhǔn)確匹配;
          • -iname:不區(qū)分文件名的大小寫;
          • -inode:按照文件 inode 號查找;

          按照文件類型查找

          按照文件類型查找,可以使用 -type 選項,具體支持的文件類型如下:

          • f:普通文件
          • d:目錄文件
          • l:鏈接文件
          • s:套接字文件
          • p:管道文件
          • b:塊設(shè)備文件,比如:磁盤
          • c:字符設(shè)備文件,比如:鍵盤、鼠標(biāo)、網(wǎng)卡

          按照文件從屬關(guān)系查找

          • -user:以用戶名查找
          • -group:以組名查找
          • -uid:以用戶 ID 查找
          • -gid:以組 ID 查找
          • -nouser:查找沒有屬主的文件
          • -nogroup:查找沒有屬組的文件

          按照文件大小查找

          按照文件大小查找功能十分常用,用 -size 選項,選項后邊指定大小 1024M,表示大小的格式有如下幾種:

          • -5M:查找小于 5M 的文件
          • +5M:查找大于 5M 的文件
          • 5M:查找大小為 5M 的文件

          單位支持的有 c(字節(jié))、kM、G 等,需要注意的是默認單位并不是字節(jié),而是 b,大小為 512 字節(jié)。

          按照時間查找

          按照時間查找的功能對系統(tǒng)管理員來說,十分常用,find 支持如下幾種時間類型:

          • atime:以訪問時間查找
          • mtime:以數(shù)據(jù)修改時間查找
          • ctime:以元數(shù)據(jù)修改時間查找
          • newer:以文件為條件,判斷比它新的文件

          按時間查找時,使用格式如下:

          • -atime -5:表示 5 天內(nèi)訪問過的文件;
          • -atime +5:表示 6 天前訪問過的文件;
          • -atime 5:表示前 5-6 那一天訪問的文件;

          這個 +5 含義總是被人理解錯,誤認為是 5 天后修改的文件,如果能知道未來 5 天的事情,小編早就去買彩票了!可能這么說還不是很清楚,直接看圖吧!

          find 不僅可以按 為單位來查找文件,可以按照 aminmmincmin 來查找,區(qū)別只是 min 選項單位為分鐘。

          按照權(quán)限查找

          按權(quán)限查找是通過 -perm 選項,可以按照如下方式使用:

          • -perm 644:精確權(quán)限查找
          • -perm /666:任何一類用戶中的任何一位符合條件即滿足
          • -perm -222:每一類用戶的每一位同時符合條件即滿足

          組合條件

          find 可以使用多個條件的組合,支持 -a、-o、-not!,比較簡單,不再詳細描述其含義。

          處理動作

          find 根據(jù)各種條件查找后,支持執(zhí)行相關(guān)的處理動作,可以讓我們的更方便和靈活,而不只是打印出來。

          • -print:打印,默認動作,可省略
          • -ls:以 ls 長文件格式輸出
          • -delete:刪除查找到的文件
          • -exec:查找到的文件傳遞給任何 Linux 命令
          • -ok:與 exec 功能相同,區(qū)別是需要用戶確認每次的操作

          再啰嗦一下,find 命令支持的參數(shù)和選項比較多,文中只是總結(jié)出最常用、核心的參數(shù)選項。如果上述命令確實不滿足需求,可以請教你的男人 man find。

          這里需要提一下,find 搜索文件時通過掃描磁盤來進行的,盡可能不要大范圍的搜索文件,尤其是在 / 目錄下搜索,會長時間消耗服務(wù)器的 cpu 資源。如果是生產(chǎn)環(huán)境的機器,執(zhí)行前要考慮是否會對業(yè)務(wù)造成影響。

          擴展 locate

          雖然 find 功能非常強大,但要知道的是,find 執(zhí)行過程是通過掃描磁盤文件來進行查找的,如果大范圍的查找文件,需要花費的時間很長,且消耗服務(wù)器 cpu 資源。

          這里推薦另一個 Linux 文件查找神器 locate,類似于 win 平臺下的 everything。它基于索引表進行查詢,查詢速度非常快,基本不占用 cpu 資源。

          使用方法非常簡單

          $ locate file.txt
          $ locate /etc/httpd

          需要注意,如果是當(dāng)天新創(chuàng)建的文件,通過 locate 默認是查不到的,因為它的數(shù)據(jù)庫默認是每天自動更新一次。如果希望查詢到當(dāng)天創(chuàng)建的新文件,需要執(zhí)行 updatedb 即可。

          查找速度快是 locate 的優(yōu)勢,但它的缺點也非常明顯:

          • 模糊查詢
          • 查找匹配模式單一
          • 查詢的名稱匹配路徑命令
          • 索引表的建立會占用磁盤空間
          • 非實時查詢,當(dāng)天數(shù)據(jù)可能查不到

          好了,到這里關(guān)于 find 命令的全部內(nèi)容已經(jīng)結(jié)束,希望文中的案例和總結(jié)能夠幫助你更好的使用它。同時也強烈建議收藏本文,以作為 Linux 常用命令手冊。

          好了,本次分享就到這里了!謝謝大家,我是肖邦,歡迎關(guān)注后續(xù)的精彩內(nèi)容。


          推薦閱讀:

          數(shù)據(jù)庫系統(tǒng)設(shè)計概述

          Kafka原理篇:圖解kakfa架構(gòu)原理

          架構(gòu)設(shè)計方法論

          從面試角度一文學(xué)完 Kafka

          數(shù)據(jù)庫跟緩存的雙寫一致性

          全網(wǎng)最詳盡的負載均衡原理圖解


          關(guān)互聯(lián)網(wǎng)全棧架構(gòu),。

               


          瀏覽 75
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产探花视频网站 | 成人在线黄色视频网站 | 国产精品久久久久三级无码 | 三级久久久 | 亚洲成人p|