https://www.cnblogs.com/bianchengzhuji/p/10133821.html
在《Linux中的文件查找技巧》一文中,我們已經知道了文件查找的基本方法,今天我們介紹find命令的一些高級使用技巧。它能滿足我們一些更加復雜的需求。
有時候需要清理一些空的文件或者文件夾。這個時候就需要先找到它們。
我們利用之前介紹過的size參數,例如:
find ./ -size 0 #查找當前目錄下大小為0的文件
./size_0_file
當然也可以利用-empty參數,例如:
find -type f -empty # -type f指明了要查找的是文件
./size_0_file
查找空目錄只需要利用-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/,否則結果將不正確。測試的時候,發(fā)現./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后面跟的是要執(zhí)行的命令,這里只是簡單舉例。
我們還可以利用-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"
以上幾個實例簡單介紹了條件的組合使用。更豐富的用法可以自行探索。
環(huán)境上日志文件太多,想刪除某個時間之前的文件,該怎么處理?
可以利用以下參數:
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 文件大小,單位為字節(jié)
%d 文件所在目錄層級
%u 文件所屬用戶
%p 帶相對路徑的完整名
%y 文件類型
…
還有很多,這里不一一列舉,有興趣的讀者可以查看find的幫助手冊。
find命令用法很豐富,本文僅列出一些實用的find命令高級用法。有哪些特殊場景沒有在本文體現的也歡迎讀者在文末留言。
注意:
-prune參數與-depth或-delete參數一起使用時,-prune將失效。
\后面的字符串表明shell不解釋該字符串,留給命令本身去解釋處理。
基本使用可參考《Linux中的文件查找技巧》
公眾號【編程珠璣】:專注但不限于分享計算機編程基礎,Linux,C語言,C++,Python,數據庫等編程相關[原創(chuàng)]技術文章,號內包含大量經典電子書和視頻學習資源。歡迎一起交流學習,一起修煉計算機“內功”,知其然,更知其所以然。
聯系客服