find命令高級用法

2021-02-19 編程珠璣
前言

在《Linux中的文件查找技巧》一文中,我們已經知道了文件查找的基本方法,今天我們介紹find命令的一些高級使用技巧。它能滿足我們一些更加複雜的需求。

查找空文件或空目錄

有時候需要清理一些空的文件或者文件夾。這個時候就需要先找到它們。

1.查找空文件

我們利用之前介紹過的size參數,例如:

find ./ -size 0 
./size_0_file

當然也可以利用-empty參數,例如:

find -type f -empty # -type f指明了要查找的是文件
./size_0_file

2.查找空目錄

查找空目錄只需要利用-empty參數即可。例如:

find -type d -empty
./test3
./find/test3
./find/test2
./test2

查找出這些空文件或者文件夾,通常要對其進行處理,最常見的操作就是刪除。如何刪除呢?我們後面再說。

查找時排除文件或目錄查找時排除文件

例如,我們按照名字查找某一類文件,但是又不想找到其中的.log文件時,可以使用!邏輯運算符查找,例如:

find ./ -name "*test*"  ! -name "*.log" #排除.log文件
./find/test.sh
./find/test.zip

查找時排除目錄

我們在查找某些文件時,可能已經知道某個目錄有,但又不想浪費時間再次查找,可以使用-prune參數和-path參數,例如:

find .  -path ./test -prune -o -name "*.txt"

這裡查找txt文件,但是排除test目錄下的txt文件。但是注意./test不能寫成./test/,否則結果將不正確。測試的時候,發現./test仍然會出現在查找結果中。另外-prune不要和-depth(-delete)一起使用,否則-prune將不起作用。

如果需要排除多個目錄呢?

find ./ \( -path "./test" -o -path "./home" \) -prune -o -name "*.txt" 

注意,這裡(和\)前後都有空格。它是告訴shell後面的字符不解釋,讓find命令自己解釋其作用。

當然了,排除目錄還可以使用!邏輯符號。例如:

find ./ -name "*.txt" ! -path "./test"

對查找到的文件執行命令操作

在查找到文件之後,我們可能需要對它進行操作,例如刪除,移動等。我們可以利用xargs。例如:

find -name "*.log" |xargs rm -f 
find -name "*test" |xargs chmod 755 
find -name "*test" |xargs grep "hello" 

xargs後面跟的是要執行的命令,這裡只是簡單舉例。

我們還可以利用-exec參數。例如:

find ./ -name "*txt"  -exec rm -f {} \;
find ./ -name "*txt"  -exec cp {} ./test \;

這裡的{}指代了查找到的內容。\;作為命令參數結束的標誌,因此是必要的。小編提醒一下,刪除需謹慎,都是淚啊。rm 帶上-i參數,可進行交互式刪除,即需要詢問。

我們也可以利用-ok參數,它與-exec的差別在於,它會詢問用戶,很適合用於刪除:

find ./ -name "*.log" -ok ls -al {} \;
< ls ... ./locate/locate.log > ? 

刪除查找到的文件

除了前面介紹的利用xargs和exec刪除文件之外,還可以利用-delete參數。例如:

find ./ -name "*.log" -delete 

多條件組合查找

在前面其實我們已經看到了條件組合的使用。常用的條件組合參數有-a(and),-o(or),!(not)。我們來看幾個實例:
實例1.查找普通文件和符號連結文件:

find ./ -type f -o -type l 

實例2.在當前目錄下查找zip包和gz包:

find ./ -name "*.zip" -o -name "*.gz"

實例3.查找名為test的符號連結文件:

find ./ -name "*test" -a -type l

實例4.查找log文件以外的文件:

find ./ ! -name "*.log"

以上幾個實例簡單介紹了條件的組合使用。更豐富的用法可以自行探索。

查找比某文件新或某文件舊的文件

環境上日誌文件太多,想刪除某個時間之前的文件,該怎麼處理?
可以利用以下參數:

newer 修改時間更新的

anewer 訪問時間更新的

ctime 修改時間更新的,包括屬性的修改

find ./ ! -newer 1.log |xargs ls -al #列出比1.log更舊的文件
find ./  -newer 1.log |xargs ls -al #列出比1.log更新的文件

這裡我只是列出,並沒有刪除,刪除可參考前面介紹的刪除找到的文件。而如果要查找出比文件1更新,比文件2舊的文件,只需要利用組合條件即可。

查找結果以特定格式輸出

前面的多數查找結果只是列出路徑和文件名,如何獲取更多信息呢?當然我們可以利用xargs或者exec,結合ls -al獲取文件的更多信息,但是我們還有更好的方法。例如,將查找到的log文件的文件名,訪問時間,權限信息,大小等信息輸出:

find ./ -name "*.log" -printf "%f %a %M %s\n"
locate.log Sat Nov 24 09:44:22.3078519090 2018 -rw-rw-r-- 69
test.log Sat Dec 15 15:09:33.9905929210 2018 -rw-rw-r-- 0

常見的格式控制輸出如下:

%f 文件名

%a 訪問時間

%c 修改時間

%M 權限信息

%m 權限位信息

%s 文件大小,單位為字節

%d 文件所在目錄層級

%u 文件所屬用戶

%p 帶相對路徑的完整名

%y 文件類型

還有很多,這裡不一一列舉,有興趣的讀者可以查看find的幫助手冊。

總結

find命令用法很豐富,本文僅列出一些實用的find命令高級用法。有哪些特殊場景沒有在本文體現的也歡迎讀者在文末留言。

注意:

相關焦點

  • Linux工作必備命令:find命令,搜索神器高級用法
    linux系統下一切都是文檔(廢話,windows也是),而且作為開發人員平時是不使用圖形界面的,那麼多的文檔不可能都記住放在哪裡,有時候我們印象中只是記下了文檔大概的名字或者文件格式,這時候我們就需要find命令根據我們僅存的記憶來搜索文檔了。
  • find指令用法
    find指令用法Linux文件系統中不止可以通過ls進行簡單的文件檢索功能,還可以通過find進行更高級的文件檢索功能。
  • 【玩轉Linux命令】Linux中find常見用法
    Hi,敏娜桑,又到了周四,在進考場之前(畢竟小年輕),小編我準備給大家發一篇Linux命令,Find的用法,23333333.
  • 教你Linux find命令實例教程:15個find命令用法
    一旦您知道如何在Linux中使用find命令,每個文件都只需敲擊幾下。命令的CPU負載您可以使用-type d選項告訴find命令專門查找目錄。出於明顯的原因,這可能是一個安全問題,但是可以使用find命令和一些選項輕鬆隔離這些文件。find命令有兩個選項可幫助我們搜索具有特定權限的文件:-user和-perm。要查找普通用戶能夠以root特權執行的文件,可以使用以下命令:$ find /path/to/search -user root -perm /4000
  • Centos8系統的find命令常用方法
    Linux系統中的find命令用來在指定的目錄下查找文件。語法:Find [option] [path][expression]我們通過實例介紹find的具體用法:-name:按照名稱查找實例1、在當前目錄下查找文件lxt.find
  • linux常用命令—find
    Linux的find 命令有非常大的靈活性,可以向其指定豐富的搜索條件(如文件權限、屬主、屬組、文件類型、日期和大小等)來定位系統中的文件和目錄。此外,find 還支持對搜索到的結果進行多種類型的命令操作。
  • Linux 命令行:find 的 26 個用法示例
    該命令與以下命令效果相同$ find .$ find . -print2、查找特殊的目錄或路徑下面的命令會查找當前目錄下 test 文件夾中的文件,默認列出所有文件。$ find ./test./test./test/abc.txt.
  • Linux中find命令的使用詳解(上)
    find命令是各種Linux發現版中比較重要的、常用的一個命令,該命令功能強大,熟練掌握了這個命令的使用,對平時的系統運維、管理工作會起到事半功倍的效果。二.find命令的格式通過find的在線幫助文檔,我們可以知道,find命令的使用格式為:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...]
  • Find命令使用
    slocate先將當前目錄結構做成一個資料庫,然後在此資料庫中搜索匹配記錄,因此它比find命令的搜索速度更快。--生成資料庫的命令:updatedb。輸入updatedb命令後,在var/lib/mlocate 中生成mlocate.db.
  • Linux下find命令用法詳解
    test2、在主目錄下查找名稱為test的所有文件:find /home –name test3、在主目錄下查找test的所有文件,且不分區大小寫:find /home -iname test4、查找名稱為test的所有目錄:find / -type d -name test5、當前目錄查找名為test.php的所有php文件
  • Linux中find命令用法全匯總,看完就沒有不會用的!
    來源丨馬哥LInux運維Linux 查找命令是Linux系統中最重要和最常用的命令之一。
  • 每天學一個 Linux 命令(20):find
    命令簡介find 命令在文件系統中搜索文件和目錄。find 命令用來在指定目錄下查找文件,在參數之前的任何字符串都會當作是目錄名。使用 find 命令時,如何不設置任何參數,則 find 命令將在當前目錄下查找子目錄與文件,並且將查找到的子目錄和文件全部顯示出來。
  • 幾個常用的 Git 高級命令
    (點擊上方公眾號,可快速關注)來源:koala bear ,wsfdl.com/devops/2014/11/20/幾個常用的git高級命令
  • find命令基本使用
    實例目錄本文主要介紹find命令在實際運維中經常使用的案例。1. 功能說明find命令主要用於插到指定目錄下的文件,其語法格式如下。find [目錄路徑] [參數] 文件名2.常用參數選項find命令的常用選項及說明可見下表。3. 實例1. 查找/home目錄大小為0的文件,並將其列出來majnxg@majnxg-PC:~$ find /home/ -empty -type f -exec ls -lrt {} \;2.
  • Linux之find命令參數總結
    Liunx find系列Linux之find命令Liunx之find常用命令匯總Linux之find execLinux之findxargsfind 常見的注意事項使用name選項文件名選項是find命令最常用的選項,要麼單獨使用該選項,要麼和其他選項一起使用。
  • Linux系統find查找命令運用
    前兩天找raksmart機房要了一臺測試機,測試一些東西,然後呢,就想著謝謝find查找命令,find查找命令是我最喜歡的查找命令了,很簡單,而且很精確,下面就詳細的給大家介紹一下:使用格式:# find [options] [查找路徑] [查找條件] [處理動作]查找路徑:默認為當前目錄
  • Linux中find命令細節詳解
    提示:點擊上方"Linux公社"↑免費訂閱find命令特點:文件查找,實時查找,速度略慢,精確匹配使用格式:# find [options] [{}x \;處理動作:-ls:以長格式顯示文件信息-exec COMMAND {} \; -->  對查找到的文件執行指定的命令,{}
  • Linux find命令+n -n n 的理解
    1、man find 解釋:find - search for files in a directory hierarchy,即:在目錄下查找文件2、按文件被修改的時間查詢文件命令格式: find 目錄 -mtime +n
  • mongodb的文檔查詢命令find
    find命令語法MongoDB數據查詢使用find函數,其功能與SQL中的select函數相同,可提供與關係型資料庫類似的許多功能,包含映射、排序等。語法:db.col.find(query, projection)其中,query為查詢條件,projection使用 pretty() 方法,以易讀(格式)的方式來讀取數據。
  • CAD命令及用法詳解
    直線:L用法:輸入命令L/回車/滑鼠指定第一點/輸入數值(也就是指定第二點)/回車(這時直線就畫出來了)/回車(結束命令)射線:RAY  用法:輸入命令RAY/回車/滑鼠指定射線起點/指定通過點/回車(結束命令)構造線:XL  用法:輸入命令XL/回車/滑鼠指定構造線起點/指定通過點/回車(結束命令