find 是平常工具箱中功能強大、靈活的命令行程序之一。它如它名字所暗示的:查找符合你指定條件的文件和目錄。藉助 -exec 或 -delete 之類的參數,你可讓它對找到的文件進行操做。 |
在命令行提示系列的這一期中,你將會看到 find 命令的介紹,並學習如何使用內置命令或使用 xargs 命令處理文件。html
查找文件linux
find 至少要加上查找的路徑。例如,此命令將查找(並打印)系統上的每一個文件:shell
find /
因爲一切皆文件,所以你會看到大量的輸出。這可能沒法幫助你找到所需的內容。你能夠更改路徑參數縮小範圍,但這實際上並無比使用 ls 命令更好。所以,你須要考慮要查找的內容。
也許你想在家目錄中查找全部 JPEG 文件。 -name 參數容許你將結果限制爲與給定模式匹配的文件。工具
find ~ -name '*jpg'
可是等等!若是其中一些擴展名是大寫怎麼辦? -iname 相似於 -name,但不區分大小寫:學習
find ~ -iname '*jpg'
很好!可是 8.3 命名方案出自 1985 年。某些圖片的擴展名多是 .jpeg。幸運的是,咱們能夠將模式使用「或」(-o)進行組合。括號須要轉義,以便使 find 命令而不是 shell 程序嘗試解釋它們。測試
find ~ \( -iname 'jpeg' -o -iname 'jpg' \)
更進一步。若是你有一些以 jpg 結尾的目錄怎麼辦?(我不懂你爲何將目錄命名爲 bucketofjpg 而不是 pictures?)咱們能夠加上 -type 參數來僅查找文件:htm
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f
或者,也許你想找到那些名字奇怪的目錄,以便以後能夠重命名它們:圖片
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d
最近你拍攝了不少照片,所以使用 -mtime(修改時間)將範圍縮小到最近一週修改過的文件。 -7 表示 7 天或更短期內修改的全部文件。get
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7
使用 xargs 進行操做table
xargs 命令從標準輸入流中獲取參數,並基於它們執行命令。繼續使用上一節中的示例,假設你要將上週修改過的家目錄中的全部 JPEG 文件複製到 U 盤,以便插到電子相冊上。假設你已經將 U 盤掛載到 /media/photo_display。
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7 -print0 | xargs -0 cp -t /media/photo_display
這裏的 find 命令與之前的版本略有不一樣。-print0 命令讓輸出有一些更改:它不使用換行符,而是添加了一個 null 字符。xargs 的 -0(零)選項可調整解析以達到預期效果。這很重要,否則對包含空格、引號或其餘特殊字符的文件名執行操做可能沒法按預期進行。對文件採起任何操做時,都應使用這些選項。
cp 命令的 -t 參數很重要,由於 cp 一般要求目的地址在最後。你能夠不使用 xargs 而使用 find 的 -exec 執行此操做,可是 xargs 的方式會更快,尤爲是對於大量文件,由於它會單次調用 cp。
瞭解更多
這篇文章僅僅是 find 能夠作的事情的表面。 find 支持基於權限、全部者、訪問時間等的測試。它甚至能夠將搜索路徑中的文件與其餘文件進行比較。將測試與布爾邏輯相結合,能夠爲你提供驚人的靈活性,以精確地找到你要查找的文件。使用內置命令或管道傳遞給 xargs,你能夠快速處理大量文件。