Linux的祕密:這才是find的正確使用姿勢

Linux的秘密:這才是find的正確使用姿勢

毋庸置疑的,作為一個經常要和Linux打交道的開發人員而言,find都是我們日常工具箱中使用最頻繁的命令行工具之一,因此其實是很值得我們花費更多時間,來研究一下他的用法的。

最差的find實踐:find 路徑名

find命令所需要的最少的一個參數,是所要搜尋的路徑。比如,我們可以這樣來使用find命令:

find /

天哪,你的屏幕迅速滾動起來了!這完全沒用,甚至還不如使用ls命令。顯然的,到了我們需要做點什麼的時候了。

稍微好一點:加上-name參數

好吧,也許你只是想在當前用戶主目錄中找到所有的jpg文件。 使用-name參數,可以幫助你實現這個目標。

find ~ -name '*jpg'

可是,我記得我藏了一個很......的圖片在一個很深的目錄裡面,它哪裡去了?或許?

Linux的秘密:這才是find的正確使用姿勢

它的擴展名可能是大寫的,比如這樣:JPG?

嗯,很多圖片一不小心就會存成這樣,所幸的是,find也想到了這一點!用-iname來替代-name吧,就像下面那樣,它的優點是,可以把不管是大寫還是小寫,還是半大寫半小寫的都給搜出來,嗯,這在模式匹配中叫什麼來著,對了:大小寫無關性。

find ~ -iname '*jpg'

等等,好像出來一些了,但我記得我存了很多啊,怎麼只有這幾個文件?嗯,或許你的是另外的一種情況:

它的擴展名可能不僅僅包括jpg,也包括jpeg

一定是這樣!一些圖片可能就是有一個.jpeg擴展名。 幸運的是,我們可以將模式與由-o表示的“或”組合起來,一起使用,比如像下面這樣:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \)

這裡有兩點是需要特別說明的:

  • 作為一個二元操作符,-o要求或的部分整體用小括號擴起來,但需要注意命令行中但轉義,這是必須的

  • 與此同時,括號和對應的操作值,比如這裡的-iname '*jpeg'之間,至少要有一個空格

Perfect!唯一有點兒美中不足的,是還不夠清爽啊,天知道當時,我怎麼會心血來潮的把這些文件所在的目錄,命名為什麼jueMiJpg,gongzuoJpg的,莫非是為了表示這是正兒八經的圖片文件夾?

可是我現在,只想找到這些文件啊!

Linux的秘密:這才是find的正確使用姿勢

-type f參數登場

Linux的哲學告訴我們,只要我們想到,就一定能在Linux下辦到。是的,-type f參數,就是解決這一問題的利器,它像一個管道一樣,將只查找並輸出文件,而不包括文件夾:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f

當然,既然有-type f,也肯定會有-type d,說不定我以後就是想找那些命名古怪的目錄,以便稍後重命名它們呢:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d

好吧,這可能還是不能令老闆滿意,就在上週,他要求設計師鼓搗100張圖片出來,但現在整個目錄下,有近1,000個文件,我怎麼直到哪些是上週提交的啊?需要寫一個腳本?

答案是:不!因為我們可以:

建立基於find的時間粒度查找器

Linux的秘密:這才是find的正確使用姿勢

Linux下,每個文件都包含有3個重要的時間點,在find命令中,則對應表達為:

  • 創建日期:-ctime

  • 最後修改日期:-mtime

  • 最近一次訪問日期:-atime

這裡,當然是要用-mtime,我們的策略則是:查下最近7天內,設計師提交了多少圖片,這裡,要用到的是時間運算符號是減號(-),它代表了n天內,比如這樣:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7

把結果輸出出來,然後統計下個數,就能向老闆交差了。

其他的時間粒度和運算符號

既然有減號(-),那自然就有加號(+),在find的時間粒度查找中,加號(+)表示什麼呢?意思很清楚,n天前,所以下面的邏輯關係應該是成立的:

 find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7+ find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime +7---------------------------------------------------------------------- find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f

那如果我想更細一些的時間粒度呢?比如不是天?這方面,find可以到達的粒度是分鐘,對應著ctime、mtime和atime,有cmin、mmin和amin供我們使用,不過應該用不著吧?

處理完了照片的事情,也許需要來關心關心磁盤的空間了,作為日常的維護,我們總是要定期的把那些已經過期(比如30天前),但巨大(比如大於1G)的log清理掉,第一步當然就是找出它們:

通過-size參數確定所需查找文件的大小

find /var/log -size +1G -mtime +30

好了,我覺得我已經夠多了。find的所有技巧都在這了麼?當然不是,比如你或許可能還會看到這樣的find命令:

find /data -owner root

它代表查詢所有擁有者是root的文件,又或許,有這樣的命令

find ~ -perm -o=r

它將在當前主目錄下,查找出所有隻讀的文件,以確保你不會過度的分享。所以,這篇文章其實只是抓住了可以做的事情的表面。通過和比如正則,以及布爾邏輯相結合,可以為您提供難以置信的find查找的靈活性,以便準確找到要查找的文件。

你還喜歡哪些find的表達式? 在評論中分享他們吧!


分享到:


相關文章: