當前位置:
首頁 > 知識 > Linux find命令高級用法

Linux find命令高級用法


來自:編程珠璣(微信號:shouwangxiansheng)


前言


在《

Linux中的文件查找技巧

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


查找空文件或空目錄


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


1、查找空文件


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

find

 ./ -size 

0

 

#查找當前目錄下大小為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 

#找到.log文件後,刪除


find -name 

"*test"

 |xargs 

chmod

 

755

 

#將找到文件的許可權修改為755


find -name 

"*test"

 |xargs 

grep

 

"hello"

 

#查找包含hello字元串的test文件



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


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

find ./ -name 

"*txt"

  -

exec

 rm -f {} ;

#找到後刪除


find ./ -name 

"*txt"

  -

exec

 cp {} ./

test

 ;

#找到後複製至test目錄下



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


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

find

 ./ -name 

"*.log"

 -ok ls -al {} ;
< ls ... ./locate/locate.

log

 > ? 

刪除查找到的文件


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


find ./ -name 

"*.log"

 -

delete

 

#刪除以log為後綴的文件


多條件組合查找


在前面其實我們已經看到了條件組合的使用。常用的條件組合參數有-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
"


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的幫助手冊。


總結


f

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


注意:




  • -prune參數與-depth或-delete參數一起使用時,-prune將失效。



  • 後面的字元串表明shell不解釋該字元串,留給命令本身去解釋處理。



  • 基本使用可參考《Linux中的文件查找技巧》

●編號670,輸入編號直達本文



●輸入m獲取文章

目錄

推薦↓↓↓



運維


更多推薦

25個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux學習 的精彩文章:

diff,Linux下文本比對方法
五款主流 Linux 發行版性能對比,不求最強但求穩

TAG:Linux學習 |