命令列技巧:使用 find 和 xargs 查詢和處理檔案

2019-10-17 13:00:00

find 是日常工具箱中功能強大、靈活的命令列程式之一。它如它名字所暗示的:查詢符合你指定條件的檔案和目錄。借助 -exec-delete 之類的引數,你可以讓它對找到的檔案進行操作。

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

更進一步。如果你有一些以 jpg 結尾的目錄怎麼辦?(我不懂你為什麼將目錄命名為 bucketofjpg 而不是 pictures?)我們可以加上 -type 引數來僅查詢檔案:

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

或者,也許你想找到那些名字奇怪的目錄,以便之後可以重新命名它們:

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

最近你拍攝了很多照片,因此使用 -mtime(修改時間)將範圍縮小到最近一週修改過的檔案。 -7 表示 7 天或更短時間內修改的所有檔案。

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

使用 xargs 進行操作

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,你可以快速處理大量檔案。